@privy-io/node 0.1.0-alpha.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/client.d.mts +3 -3
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +3 -3
  5. package/client.d.ts.map +1 -1
  6. package/client.js +1 -1
  7. package/client.js.map +1 -1
  8. package/client.mjs +1 -1
  9. package/client.mjs.map +1 -1
  10. package/index.d.mts +6 -0
  11. package/index.d.mts.map +1 -1
  12. package/index.d.ts +6 -0
  13. package/index.d.ts.map +1 -1
  14. package/index.js +7 -1
  15. package/index.js.map +1 -1
  16. package/index.mjs +2 -0
  17. package/index.mjs.map +1 -1
  18. package/internal/utils/values.js +3 -3
  19. package/internal/utils/values.js.map +1 -1
  20. package/internal/utils/values.mjs +3 -3
  21. package/internal/utils/values.mjs.map +1 -1
  22. package/lib/auth.d.mts +68 -0
  23. package/lib/auth.d.mts.map +1 -0
  24. package/lib/auth.d.ts +68 -0
  25. package/lib/auth.d.ts.map +1 -0
  26. package/lib/auth.js +130 -0
  27. package/lib/auth.js.map +1 -0
  28. package/lib/auth.mjs +123 -0
  29. package/lib/auth.mjs.map +1 -0
  30. package/lib/identity-token.d.mts +15 -0
  31. package/lib/identity-token.d.mts.map +1 -0
  32. package/lib/identity-token.d.ts +15 -0
  33. package/lib/identity-token.d.ts.map +1 -0
  34. package/lib/identity-token.js +273 -0
  35. package/lib/identity-token.js.map +1 -0
  36. package/lib/identity-token.mjs +268 -0
  37. package/lib/identity-token.mjs.map +1 -0
  38. package/lib/user-utils.d.mts +22 -0
  39. package/lib/user-utils.d.mts.map +1 -0
  40. package/lib/user-utils.d.ts +22 -0
  41. package/lib/user-utils.d.ts.map +1 -0
  42. package/lib/user-utils.js +15 -0
  43. package/lib/user-utils.js.map +1 -0
  44. package/lib/user-utils.mjs +11 -0
  45. package/lib/user-utils.mjs.map +1 -0
  46. package/package.json +19 -1
  47. package/public-api/PrivyClient.d.mts +2 -1
  48. package/public-api/PrivyClient.d.mts.map +1 -1
  49. package/public-api/PrivyClient.d.ts +2 -1
  50. package/public-api/PrivyClient.d.ts.map +1 -1
  51. package/public-api/PrivyClient.js +10 -3
  52. package/public-api/PrivyClient.js.map +1 -1
  53. package/public-api/PrivyClient.mjs +10 -3
  54. package/public-api/PrivyClient.mjs.map +1 -1
  55. package/public-api/services/ethereum.d.mts.map +1 -1
  56. package/public-api/services/ethereum.d.ts.map +1 -1
  57. package/public-api/services/ethereum.js +0 -6
  58. package/public-api/services/ethereum.js.map +1 -1
  59. package/public-api/services/ethereum.mjs +0 -6
  60. package/public-api/services/ethereum.mjs.map +1 -1
  61. package/public-api/services/solana.d.mts.map +1 -1
  62. package/public-api/services/solana.d.ts.map +1 -1
  63. package/public-api/services/solana.js +0 -3
  64. package/public-api/services/solana.js.map +1 -1
  65. package/public-api/services/solana.mjs +0 -3
  66. package/public-api/services/solana.mjs.map +1 -1
  67. package/public-api/services/users.d.mts +23 -1
  68. package/public-api/services/users.d.mts.map +1 -1
  69. package/public-api/services/users.d.ts +23 -1
  70. package/public-api/services/users.d.ts.map +1 -1
  71. package/public-api/services/users.js +24 -0
  72. package/public-api/services/users.js.map +1 -1
  73. package/public-api/services/users.mjs +24 -0
  74. package/public-api/services/users.mjs.map +1 -1
  75. package/public-api/services/utils/auth.d.mts +18 -0
  76. package/public-api/services/utils/auth.d.mts.map +1 -0
  77. package/public-api/services/utils/auth.d.ts +18 -0
  78. package/public-api/services/utils/auth.d.ts.map +1 -0
  79. package/public-api/services/utils/auth.js +33 -0
  80. package/public-api/services/utils/auth.js.map +1 -0
  81. package/public-api/services/utils/auth.mjs +29 -0
  82. package/public-api/services/utils/auth.mjs.map +1 -0
  83. package/public-api/services/utils/request-formatter.d.mts +5 -0
  84. package/public-api/services/utils/request-formatter.d.mts.map +1 -0
  85. package/public-api/services/utils/request-formatter.d.ts +5 -0
  86. package/public-api/services/utils/request-formatter.d.ts.map +1 -0
  87. package/public-api/services/utils/request-formatter.js +12 -0
  88. package/public-api/services/utils/request-formatter.js.map +1 -0
  89. package/public-api/services/utils/request-formatter.mjs +8 -0
  90. package/public-api/services/utils/request-formatter.mjs.map +1 -0
  91. package/public-api/services/utils/request-signer.d.mts +25 -0
  92. package/public-api/services/utils/request-signer.d.mts.map +1 -0
  93. package/public-api/services/utils/request-signer.d.ts +25 -0
  94. package/public-api/services/utils/request-signer.d.ts.map +1 -0
  95. package/public-api/services/utils/request-signer.js +17 -0
  96. package/public-api/services/utils/request-signer.js.map +1 -0
  97. package/public-api/services/utils/request-signer.mjs +13 -0
  98. package/public-api/services/utils/request-signer.mjs.map +1 -0
  99. package/public-api/services/utils.d.mts +12 -22
  100. package/public-api/services/utils.d.mts.map +1 -1
  101. package/public-api/services/utils.d.ts +12 -22
  102. package/public-api/services/utils.d.ts.map +1 -1
  103. package/public-api/services/utils.js +15 -9
  104. package/public-api/services/utils.js.map +1 -1
  105. package/public-api/services/utils.mjs +16 -10
  106. package/public-api/services/utils.mjs.map +1 -1
  107. package/resources/index.d.mts +1 -1
  108. package/resources/index.d.mts.map +1 -1
  109. package/resources/index.d.ts +1 -1
  110. package/resources/index.d.ts.map +1 -1
  111. package/resources/policies.d.mts +2 -1
  112. package/resources/policies.d.mts.map +1 -1
  113. package/resources/policies.d.ts +2 -1
  114. package/resources/policies.d.ts.map +1 -1
  115. package/resources/users.d.mts +35 -24
  116. package/resources/users.d.mts.map +1 -1
  117. package/resources/users.d.ts +35 -24
  118. package/resources/users.d.ts.map +1 -1
  119. package/resources/users.js +16 -16
  120. package/resources/users.js.map +1 -1
  121. package/resources/users.mjs +16 -16
  122. package/resources/users.mjs.map +1 -1
  123. package/resources/wallets/wallets.d.mts +3 -18
  124. package/resources/wallets/wallets.d.mts.map +1 -1
  125. package/resources/wallets/wallets.d.ts +3 -18
  126. package/resources/wallets/wallets.d.ts.map +1 -1
  127. package/resources/wallets/wallets.js.map +1 -1
  128. package/resources/wallets/wallets.mjs.map +1 -1
  129. package/src/client.ts +4 -4
  130. package/src/index.ts +15 -0
  131. package/src/internal/utils/values.ts +3 -3
  132. package/src/lib/auth.ts +210 -0
  133. package/src/lib/identity-token.ts +280 -0
  134. package/src/lib/user-utils.ts +31 -0
  135. package/src/public-api/PrivyClient.ts +12 -2
  136. package/src/public-api/services/ethereum.ts +0 -8
  137. package/src/public-api/services/solana.ts +0 -4
  138. package/src/public-api/services/users.ts +36 -2
  139. package/src/public-api/services/utils/auth.ts +41 -0
  140. package/src/public-api/services/utils/request-formatter.ts +6 -0
  141. package/src/public-api/services/utils/request-signer.ts +35 -0
  142. package/src/public-api/services/utils.ts +21 -31
  143. package/src/resources/index.ts +1 -1
  144. package/src/resources/policies.ts +2 -1
  145. package/src/resources/users.ts +50 -29
  146. package/src/resources/wallets/wallets.ts +6 -30
  147. package/src/version.ts +1 -1
  148. package/src/viem.ts +223 -0
  149. package/version.d.mts +1 -1
  150. package/version.d.mts.map +1 -1
  151. package/version.d.ts +1 -1
  152. package/version.d.ts.map +1 -1
  153. package/version.js +1 -1
  154. package/version.js.map +1 -1
  155. package/version.mjs +1 -1
  156. package/version.mjs.map +1 -1
  157. package/viem.d.mts +22 -0
  158. package/viem.d.mts.map +1 -0
  159. package/viem.d.ts +22 -0
  160. package/viem.d.ts.map +1 -0
  161. package/viem.js +183 -0
  162. package/viem.js.map +1 -0
  163. package/viem.mjs +180 -0
  164. package/viem.mjs.map +1 -0
package/viem.js ADDED
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createViemAccount = createViemAccount;
4
+ const accounts_1 = require("viem/accounts");
5
+ const utils_1 = require("viem/utils");
6
+ const error_1 = require("./core/error.js");
7
+ /**
8
+ * Creates a viem `Account` instance for a Privy wallet given its ID, which can be used to sign
9
+ * messages and send transactions with the wallet.
10
+ *
11
+ * @param client instance of the Privy client.
12
+ * @param input an object specifying the details of the wallet to create the viem account for.
13
+ * @returns viem `Account` instance for the wallet.
14
+ */
15
+ function createViemAccount(client, { walletId, address, authorizationContext }) {
16
+ return (0, accounts_1.toAccount)({
17
+ address: address,
18
+ sign: async ({ hash }) => {
19
+ const response = await client
20
+ .wallets()
21
+ .ethereum()
22
+ .signSecp256k1(walletId, {
23
+ params: { hash },
24
+ ...(authorizationContext ? { authorization_context: authorizationContext } : {}),
25
+ });
26
+ return response.signature;
27
+ },
28
+ signMessage: async ({ message }) => {
29
+ const response = await client
30
+ .wallets()
31
+ .ethereum()
32
+ .signMessage(walletId, {
33
+ message: formatViemPersonalSignMessage(message),
34
+ ...(authorizationContext ? { authorization_context: authorizationContext } : {}),
35
+ });
36
+ return response.signature;
37
+ },
38
+ signTypedData: async (typedData) => {
39
+ const { message, domain, types, primaryType } = replaceBigInts(typedData, utils_1.toHex);
40
+ // Viem accepts undefined `domain`, `message`, and `types` in this method
41
+ // though those are required per the EIP712 spec.
42
+ if (!domain)
43
+ throw new error_1.PrivyAPIError('typedData.domain must be defined');
44
+ if (!message)
45
+ throw new error_1.PrivyAPIError('typedData.message must be defined');
46
+ if (!types)
47
+ throw new error_1.PrivyAPIError('typedData.message must be defined');
48
+ const { signature } = await client
49
+ .wallets()
50
+ .ethereum()
51
+ .signTypedData(walletId, {
52
+ params: {
53
+ typed_data: { domain, message, primary_type: primaryType, types: types },
54
+ },
55
+ ...(authorizationContext ? { authorization_context: authorizationContext } : {}),
56
+ });
57
+ return signature;
58
+ },
59
+ signTransaction: async (transaction) => {
60
+ const { signed_transaction: signedTransaction } = await client
61
+ .wallets()
62
+ .ethereum()
63
+ .signTransaction(walletId, {
64
+ params: { transaction: formatViemTransaction(transaction) },
65
+ ...(authorizationContext ? { authorization_context: authorizationContext } : {}),
66
+ });
67
+ return signedTransaction;
68
+ },
69
+ signAuthorization: async (parameters) => {
70
+ const { authorization } = await client
71
+ .wallets()
72
+ .ethereum()
73
+ .sign7702Authorization(walletId, {
74
+ params: {
75
+ contract: (parameters.contractAddress ?? parameters.address),
76
+ chain_id: parameters.chainId,
77
+ nonce: parameters.nonce,
78
+ },
79
+ ...(authorizationContext ? { authorization_context: authorizationContext } : {}),
80
+ });
81
+ return {
82
+ address: authorization.contract,
83
+ nonce: Number(authorization.nonce),
84
+ chainId: Number(authorization.chain_id),
85
+ yParity: authorization.y_parity,
86
+ r: authorization.r,
87
+ s: authorization.s,
88
+ };
89
+ },
90
+ });
91
+ }
92
+ /**
93
+ * Formats a viem transaction type to the JSON-RPC transaction type:
94
+ * - 'legacy' -> 0
95
+ * - 'eip2930' -> 1
96
+ * - 'eip1559' or undefined -> 2. This is the default EVM transaction type.
97
+ * - 'eip4844' -> 3 in theory, but will throw an error as we do not support this yet.
98
+ * - 'eip7702' -> 4 in theory, but will throw an error as we do not support this yet
99
+ * @param type viem transaction type
100
+ * @returns 0 | 1 | 2
101
+ */
102
+ const formatViemTransactionType = (type) => {
103
+ if (type === 'legacy') {
104
+ return 0;
105
+ }
106
+ else if (type === 'eip2930') {
107
+ return 1;
108
+ }
109
+ else if (type == 'eip1559' || typeof type === 'undefined') {
110
+ // Type 2 (EIP-1559) is the default transaction type
111
+ return 2;
112
+ }
113
+ else {
114
+ // We do not yet support EIP4844 (type 3) and EIP7702 (type 4) transaction types
115
+ throw new error_1.PrivyAPIError('EIP4844 and EIP7702 transaction types are not yet supported.');
116
+ }
117
+ };
118
+ /**
119
+ * Formats viem quantities, which are represented as `bigint | undefined` to our internal
120
+ * `Quantity` type. This is done by converting bigints into a hexstring.
121
+ *
122
+ * @param input {bigint | undefined} bigint quantity to format
123
+ * @returns input as hex string
124
+ */
125
+ const formatViemQuantity = (input) => {
126
+ return `0x${input.toString(16)}`;
127
+ };
128
+ /**
129
+ * Formats a `message` input to viem's `signMessage` function to the format needed for our wallet API.
130
+ *
131
+ * If the `message` is a string, we use it directly.
132
+ *
133
+ * If the `message` is an object containing a `raw` field, it indicates that the use case is signing raw bytes,
134
+ * in which case we convert `message.raw` into a `Uint8Array` before passing it to our own `signMessage`
135
+ * @param message input to viem's `signMessage` function
136
+ * @returns message as a utf-8 `string` or `Uint8Array`
137
+ */
138
+ const formatViemPersonalSignMessage = (message) => {
139
+ if (typeof message === 'string')
140
+ return message;
141
+ if (typeof message.raw === 'string') {
142
+ // We `.slice(2)` to remove the `0x` prefix
143
+ return Uint8Array.from(Buffer.from(message.raw.slice(2), 'hex'));
144
+ }
145
+ else {
146
+ return message.raw;
147
+ }
148
+ };
149
+ /**
150
+ * Formats a viem transaction into our internal transaction type. For the most part, this converts
151
+ * bigints to hexstrings so they can be passed over the wire.
152
+ *
153
+ * @param tx input to viem's `sendTransaction` function
154
+ * @returns transaction {EthereumSignTransactionInputType} as our own type
155
+ */
156
+ const formatViemTransaction = (tx) => {
157
+ return {
158
+ type: formatViemTransactionType(tx.type),
159
+ ...(tx.to ? { to: tx.to } : {}),
160
+ ...(tx.nonce ? { nonce: tx.nonce } : {}),
161
+ ...(tx.chainId ? { chain_id: tx.chainId } : {}),
162
+ ...(tx.data ? { data: tx.data } : {}),
163
+ ...(tx.value ? { value: formatViemQuantity(tx.value) } : {}),
164
+ ...(tx.gas ? { gas_limit: formatViemQuantity(tx.gas) } : {}),
165
+ ...(tx.gasPrice ? { gas_price: formatViemQuantity(tx.gasPrice) } : {}),
166
+ ...(tx.maxFeePerGas ? { max_fee_per_gas: formatViemQuantity(tx.maxFeePerGas) } : {}),
167
+ ...(tx.maxPriorityFeePerGas ?
168
+ { max_priority_fee_per_gas: formatViemQuantity(tx.maxPriorityFeePerGas) }
169
+ : {}),
170
+ };
171
+ };
172
+ const replaceBigInts = (obj, replacer) => {
173
+ if (typeof obj === 'bigint')
174
+ return replacer(obj);
175
+ if (Array.isArray(obj)) {
176
+ return obj.map((x) => replaceBigInts(x, replacer));
177
+ }
178
+ if (obj && typeof obj === 'object') {
179
+ return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, replaceBigInts(v, replacer)]));
180
+ }
181
+ return obj;
182
+ };
183
+ //# sourceMappingURL=viem.js.map
package/viem.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viem.js","sourceRoot":"","sources":["src/viem.ts"],"names":[],"mappings":"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"}
package/viem.mjs ADDED
@@ -0,0 +1,180 @@
1
+ import { toAccount, } from 'viem/accounts';
2
+ import { toHex } from 'viem/utils';
3
+ import { PrivyAPIError } from "./core/error.mjs";
4
+ /**
5
+ * Creates a viem `Account` instance for a Privy wallet given its ID, which can be used to sign
6
+ * messages and send transactions with the wallet.
7
+ *
8
+ * @param client instance of the Privy client.
9
+ * @param input an object specifying the details of the wallet to create the viem account for.
10
+ * @returns viem `Account` instance for the wallet.
11
+ */
12
+ export function createViemAccount(client, { walletId, address, authorizationContext }) {
13
+ return toAccount({
14
+ address: address,
15
+ sign: async ({ hash }) => {
16
+ const response = await client
17
+ .wallets()
18
+ .ethereum()
19
+ .signSecp256k1(walletId, {
20
+ params: { hash },
21
+ ...(authorizationContext ? { authorization_context: authorizationContext } : {}),
22
+ });
23
+ return response.signature;
24
+ },
25
+ signMessage: async ({ message }) => {
26
+ const response = await client
27
+ .wallets()
28
+ .ethereum()
29
+ .signMessage(walletId, {
30
+ message: formatViemPersonalSignMessage(message),
31
+ ...(authorizationContext ? { authorization_context: authorizationContext } : {}),
32
+ });
33
+ return response.signature;
34
+ },
35
+ signTypedData: async (typedData) => {
36
+ const { message, domain, types, primaryType } = replaceBigInts(typedData, toHex);
37
+ // Viem accepts undefined `domain`, `message`, and `types` in this method
38
+ // though those are required per the EIP712 spec.
39
+ if (!domain)
40
+ throw new PrivyAPIError('typedData.domain must be defined');
41
+ if (!message)
42
+ throw new PrivyAPIError('typedData.message must be defined');
43
+ if (!types)
44
+ throw new PrivyAPIError('typedData.message must be defined');
45
+ const { signature } = await client
46
+ .wallets()
47
+ .ethereum()
48
+ .signTypedData(walletId, {
49
+ params: {
50
+ typed_data: { domain, message, primary_type: primaryType, types: types },
51
+ },
52
+ ...(authorizationContext ? { authorization_context: authorizationContext } : {}),
53
+ });
54
+ return signature;
55
+ },
56
+ signTransaction: async (transaction) => {
57
+ const { signed_transaction: signedTransaction } = await client
58
+ .wallets()
59
+ .ethereum()
60
+ .signTransaction(walletId, {
61
+ params: { transaction: formatViemTransaction(transaction) },
62
+ ...(authorizationContext ? { authorization_context: authorizationContext } : {}),
63
+ });
64
+ return signedTransaction;
65
+ },
66
+ signAuthorization: async (parameters) => {
67
+ const { authorization } = await client
68
+ .wallets()
69
+ .ethereum()
70
+ .sign7702Authorization(walletId, {
71
+ params: {
72
+ contract: (parameters.contractAddress ?? parameters.address),
73
+ chain_id: parameters.chainId,
74
+ nonce: parameters.nonce,
75
+ },
76
+ ...(authorizationContext ? { authorization_context: authorizationContext } : {}),
77
+ });
78
+ return {
79
+ address: authorization.contract,
80
+ nonce: Number(authorization.nonce),
81
+ chainId: Number(authorization.chain_id),
82
+ yParity: authorization.y_parity,
83
+ r: authorization.r,
84
+ s: authorization.s,
85
+ };
86
+ },
87
+ });
88
+ }
89
+ /**
90
+ * Formats a viem transaction type to the JSON-RPC transaction type:
91
+ * - 'legacy' -> 0
92
+ * - 'eip2930' -> 1
93
+ * - 'eip1559' or undefined -> 2. This is the default EVM transaction type.
94
+ * - 'eip4844' -> 3 in theory, but will throw an error as we do not support this yet.
95
+ * - 'eip7702' -> 4 in theory, but will throw an error as we do not support this yet
96
+ * @param type viem transaction type
97
+ * @returns 0 | 1 | 2
98
+ */
99
+ const formatViemTransactionType = (type) => {
100
+ if (type === 'legacy') {
101
+ return 0;
102
+ }
103
+ else if (type === 'eip2930') {
104
+ return 1;
105
+ }
106
+ else if (type == 'eip1559' || typeof type === 'undefined') {
107
+ // Type 2 (EIP-1559) is the default transaction type
108
+ return 2;
109
+ }
110
+ else {
111
+ // We do not yet support EIP4844 (type 3) and EIP7702 (type 4) transaction types
112
+ throw new PrivyAPIError('EIP4844 and EIP7702 transaction types are not yet supported.');
113
+ }
114
+ };
115
+ /**
116
+ * Formats viem quantities, which are represented as `bigint | undefined` to our internal
117
+ * `Quantity` type. This is done by converting bigints into a hexstring.
118
+ *
119
+ * @param input {bigint | undefined} bigint quantity to format
120
+ * @returns input as hex string
121
+ */
122
+ const formatViemQuantity = (input) => {
123
+ return `0x${input.toString(16)}`;
124
+ };
125
+ /**
126
+ * Formats a `message` input to viem's `signMessage` function to the format needed for our wallet API.
127
+ *
128
+ * If the `message` is a string, we use it directly.
129
+ *
130
+ * If the `message` is an object containing a `raw` field, it indicates that the use case is signing raw bytes,
131
+ * in which case we convert `message.raw` into a `Uint8Array` before passing it to our own `signMessage`
132
+ * @param message input to viem's `signMessage` function
133
+ * @returns message as a utf-8 `string` or `Uint8Array`
134
+ */
135
+ const formatViemPersonalSignMessage = (message) => {
136
+ if (typeof message === 'string')
137
+ return message;
138
+ if (typeof message.raw === 'string') {
139
+ // We `.slice(2)` to remove the `0x` prefix
140
+ return Uint8Array.from(Buffer.from(message.raw.slice(2), 'hex'));
141
+ }
142
+ else {
143
+ return message.raw;
144
+ }
145
+ };
146
+ /**
147
+ * Formats a viem transaction into our internal transaction type. For the most part, this converts
148
+ * bigints to hexstrings so they can be passed over the wire.
149
+ *
150
+ * @param tx input to viem's `sendTransaction` function
151
+ * @returns transaction {EthereumSignTransactionInputType} as our own type
152
+ */
153
+ const formatViemTransaction = (tx) => {
154
+ return {
155
+ type: formatViemTransactionType(tx.type),
156
+ ...(tx.to ? { to: tx.to } : {}),
157
+ ...(tx.nonce ? { nonce: tx.nonce } : {}),
158
+ ...(tx.chainId ? { chain_id: tx.chainId } : {}),
159
+ ...(tx.data ? { data: tx.data } : {}),
160
+ ...(tx.value ? { value: formatViemQuantity(tx.value) } : {}),
161
+ ...(tx.gas ? { gas_limit: formatViemQuantity(tx.gas) } : {}),
162
+ ...(tx.gasPrice ? { gas_price: formatViemQuantity(tx.gasPrice) } : {}),
163
+ ...(tx.maxFeePerGas ? { max_fee_per_gas: formatViemQuantity(tx.maxFeePerGas) } : {}),
164
+ ...(tx.maxPriorityFeePerGas ?
165
+ { max_priority_fee_per_gas: formatViemQuantity(tx.maxPriorityFeePerGas) }
166
+ : {}),
167
+ };
168
+ };
169
+ const replaceBigInts = (obj, replacer) => {
170
+ if (typeof obj === 'bigint')
171
+ return replacer(obj);
172
+ if (Array.isArray(obj)) {
173
+ return obj.map((x) => replaceBigInts(x, replacer));
174
+ }
175
+ if (obj && typeof obj === 'object') {
176
+ return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, replaceBigInts(v, replacer)]));
177
+ }
178
+ return obj;
179
+ };
180
+ //# sourceMappingURL=viem.mjs.map
package/viem.mjs.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viem.mjs","sourceRoot":"","sources":["src/viem.ts"],"names":[],"mappings":"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"}