ox 0.9.16 → 0.10.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.
- package/CHANGELOG.md +27 -0
- package/README.md +4 -4
- package/TxEnvelope/package.json +6 -0
- package/TxEnvelopeEip1559/package.json +6 -0
- package/TxEnvelopeEip2930/package.json +6 -0
- package/TxEnvelopeEip4844/package.json +6 -0
- package/TxEnvelopeEip7702/package.json +6 -0
- package/TxEnvelopeLegacy/package.json +6 -0
- package/_cjs/core/{TransactionEnvelope.js → TxEnvelope.js} +1 -1
- package/_cjs/core/TxEnvelope.js.map +1 -0
- package/_cjs/core/{TransactionEnvelopeEip1559.js → TxEnvelopeEip1559.js} +2 -2
- package/_cjs/core/TxEnvelopeEip1559.js.map +1 -0
- package/_cjs/core/{TransactionEnvelopeEip2930.js → TxEnvelopeEip2930.js} +2 -2
- package/_cjs/core/TxEnvelopeEip2930.js.map +1 -0
- package/_cjs/core/{TransactionEnvelopeEip4844.js → TxEnvelopeEip4844.js} +4 -4
- package/_cjs/core/TxEnvelopeEip4844.js.map +1 -0
- package/_cjs/core/{TransactionEnvelopeEip7702.js → TxEnvelopeEip7702.js} +4 -4
- package/_cjs/core/TxEnvelopeEip7702.js.map +1 -0
- package/_cjs/core/{TransactionEnvelopeLegacy.js → TxEnvelopeLegacy.js} +2 -2
- package/_cjs/core/TxEnvelopeLegacy.js.map +1 -0
- package/_cjs/core/WebAuthnP256.js +1 -1
- package/_cjs/core/WebAuthnP256.js.map +1 -1
- package/_cjs/erc8021/Attribution.js +36 -6
- package/_cjs/erc8021/Attribution.js.map +1 -1
- package/_cjs/index.docs.js +1 -0
- package/_cjs/index.docs.js.map +1 -1
- package/_cjs/index.js +7 -7
- package/_cjs/index.js.map +1 -1
- package/_cjs/tempo/AuthorizationTempo.js +101 -0
- package/_cjs/tempo/AuthorizationTempo.js.map +1 -0
- package/_cjs/tempo/KeyAuthorization.js +123 -0
- package/_cjs/tempo/KeyAuthorization.js.map +1 -0
- package/_cjs/tempo/PoolId.js +10 -0
- package/_cjs/tempo/PoolId.js.map +1 -0
- package/_cjs/tempo/SignatureEnvelope.js +394 -0
- package/_cjs/tempo/SignatureEnvelope.js.map +1 -0
- package/_cjs/tempo/Tick.js +77 -0
- package/_cjs/tempo/Tick.js.map +1 -0
- package/_cjs/tempo/TokenId.js +28 -0
- package/_cjs/tempo/TokenId.js.map +1 -0
- package/_cjs/tempo/TokenRole.js +26 -0
- package/_cjs/tempo/TokenRole.js.map +1 -0
- package/_cjs/tempo/Transaction.js +80 -0
- package/_cjs/tempo/Transaction.js.map +1 -0
- package/_cjs/tempo/TransactionReceipt.js +26 -0
- package/_cjs/tempo/TransactionReceipt.js.map +1 -0
- package/_cjs/tempo/TransactionRequest.js +53 -0
- package/_cjs/tempo/TransactionRequest.js.map +1 -0
- package/_cjs/tempo/TxEnvelopeTempo.js +267 -0
- package/_cjs/tempo/TxEnvelopeTempo.js.map +1 -0
- package/_cjs/tempo/index.js +15 -0
- package/_cjs/tempo/index.js.map +1 -0
- package/_cjs/version.js +1 -1
- package/_esm/core/Blobs.js +8 -8
- package/_esm/core/{TransactionEnvelope.js → TxEnvelope.js} +11 -11
- package/_esm/core/TxEnvelope.js.map +1 -0
- package/_esm/core/{TransactionEnvelopeEip1559.js → TxEnvelopeEip1559.js} +42 -42
- package/_esm/core/TxEnvelopeEip1559.js.map +1 -0
- package/_esm/core/{TransactionEnvelopeEip2930.js → TxEnvelopeEip2930.js} +43 -43
- package/_esm/core/TxEnvelopeEip2930.js.map +1 -0
- package/_esm/core/{TransactionEnvelopeEip4844.js → TxEnvelopeEip4844.js} +42 -42
- package/_esm/core/TxEnvelopeEip4844.js.map +1 -0
- package/_esm/core/{TransactionEnvelopeEip7702.js → TxEnvelopeEip7702.js} +40 -40
- package/_esm/core/TxEnvelopeEip7702.js.map +1 -0
- package/_esm/core/{TransactionEnvelopeLegacy.js → TxEnvelopeLegacy.js} +42 -42
- package/_esm/core/TxEnvelopeLegacy.js.map +1 -0
- package/_esm/core/WebAuthnP256.js +1 -1
- package/_esm/core/WebAuthnP256.js.map +1 -1
- package/_esm/erc8021/Attribution.js +58 -13
- package/_esm/erc8021/Attribution.js.map +1 -1
- package/_esm/index.docs.js +1 -0
- package/_esm/index.docs.js.map +1 -1
- package/_esm/index.js +192 -192
- package/_esm/index.js.map +1 -1
- package/_esm/tempo/AuthorizationTempo.js +664 -0
- package/_esm/tempo/AuthorizationTempo.js.map +1 -0
- package/_esm/tempo/KeyAuthorization.js +426 -0
- package/_esm/tempo/KeyAuthorization.js.map +1 -0
- package/_esm/tempo/PoolId.js +28 -0
- package/_esm/tempo/PoolId.js.map +1 -0
- package/_esm/tempo/SignatureEnvelope.js +660 -0
- package/_esm/tempo/SignatureEnvelope.js.map +1 -0
- package/_esm/tempo/Tick.js +147 -0
- package/_esm/tempo/Tick.js.map +1 -0
- package/_esm/tempo/TokenId.js +71 -0
- package/_esm/tempo/TokenId.js.map +1 -0
- package/_esm/tempo/TokenRole.js +40 -0
- package/_esm/tempo/TokenRole.js.map +1 -0
- package/_esm/tempo/Transaction.js +167 -0
- package/_esm/tempo/Transaction.js.map +1 -0
- package/_esm/tempo/TransactionReceipt.js +138 -0
- package/_esm/tempo/TransactionReceipt.js.map +1 -0
- package/_esm/tempo/TransactionRequest.js +99 -0
- package/_esm/tempo/TransactionRequest.js.map +1 -0
- package/_esm/tempo/TxEnvelopeTempo.js +607 -0
- package/_esm/tempo/TxEnvelopeTempo.js.map +1 -0
- package/_esm/tempo/index.js +298 -0
- package/_esm/tempo/index.js.map +1 -0
- package/_esm/version.js +1 -1
- package/_types/core/Blobs.d.ts +8 -8
- package/_types/core/{TransactionEnvelope.d.ts → TxEnvelope.d.ts} +11 -11
- package/_types/core/TxEnvelope.d.ts.map +1 -0
- package/_types/core/{TransactionEnvelopeEip1559.d.ts → TxEnvelopeEip1559.d.ts} +54 -54
- package/_types/core/TxEnvelopeEip1559.d.ts.map +1 -0
- package/_types/core/{TransactionEnvelopeEip2930.d.ts → TxEnvelopeEip2930.d.ts} +55 -55
- package/_types/core/TxEnvelopeEip2930.d.ts.map +1 -0
- package/_types/core/{TransactionEnvelopeEip4844.d.ts → TxEnvelopeEip4844.d.ts} +54 -54
- package/_types/core/TxEnvelopeEip4844.d.ts.map +1 -0
- package/_types/core/{TransactionEnvelopeEip7702.d.ts → TxEnvelopeEip7702.d.ts} +49 -49
- package/_types/core/TxEnvelopeEip7702.d.ts.map +1 -0
- package/_types/core/{TransactionEnvelopeLegacy.d.ts → TxEnvelopeLegacy.d.ts} +54 -54
- package/_types/core/TxEnvelopeLegacy.d.ts.map +1 -0
- package/_types/core/WebAuthnP256.d.ts +1 -1
- package/_types/core/WebAuthnP256.d.ts.map +1 -1
- package/_types/erc8021/Attribution.d.ts +20 -6
- package/_types/erc8021/Attribution.d.ts.map +1 -1
- package/_types/index.d.ts +192 -192
- package/_types/index.d.ts.map +1 -1
- package/_types/index.docs.d.ts +1 -0
- package/_types/index.docs.d.ts.map +1 -1
- package/_types/tempo/AuthorizationTempo.d.ts +688 -0
- package/_types/tempo/AuthorizationTempo.d.ts.map +1 -0
- package/_types/tempo/KeyAuthorization.d.ts +437 -0
- package/_types/tempo/KeyAuthorization.d.ts.map +1 -0
- package/_types/tempo/PoolId.d.ts +33 -0
- package/_types/tempo/PoolId.d.ts.map +1 -0
- package/_types/tempo/SignatureEnvelope.d.ts +438 -0
- package/_types/tempo/SignatureEnvelope.d.ts.map +1 -0
- package/_types/tempo/Tick.d.ts +120 -0
- package/_types/tempo/Tick.d.ts.map +1 -0
- package/_types/tempo/TokenId.d.ts +55 -0
- package/_types/tempo/TokenId.d.ts.map +1 -0
- package/_types/tempo/TokenRole.d.ts +29 -0
- package/_types/tempo/TokenRole.d.ts.map +1 -0
- package/_types/tempo/Transaction.d.ts +208 -0
- package/_types/tempo/Transaction.d.ts.map +1 -0
- package/_types/tempo/TransactionReceipt.d.ts +165 -0
- package/_types/tempo/TransactionReceipt.d.ts.map +1 -0
- package/_types/tempo/TransactionRequest.d.ts +89 -0
- package/_types/tempo/TransactionRequest.d.ts.map +1 -0
- package/_types/tempo/TxEnvelopeTempo.d.ts +551 -0
- package/_types/tempo/TxEnvelopeTempo.d.ts.map +1 -0
- package/_types/tempo/index.d.ts +300 -0
- package/_types/tempo/index.d.ts.map +1 -0
- package/_types/version.d.ts +1 -1
- package/core/Blobs.ts +8 -8
- package/core/{TransactionEnvelope.ts → TxEnvelope.ts} +10 -10
- package/core/{TransactionEnvelopeEip1559.ts → TxEnvelopeEip1559.ts} +60 -69
- package/core/{TransactionEnvelopeEip2930.ts → TxEnvelopeEip2930.ts} +61 -72
- package/core/{TransactionEnvelopeEip4844.ts → TxEnvelopeEip4844.ts} +62 -71
- package/core/{TransactionEnvelopeEip7702.ts → TxEnvelopeEip7702.ts} +58 -67
- package/core/{TransactionEnvelopeLegacy.ts → TxEnvelopeLegacy.ts} +59 -68
- package/core/WebAuthnP256.ts +3 -1
- package/erc8021/Attribution.ts +77 -15
- package/index.docs.ts +1 -0
- package/index.ts +192 -195
- package/package.json +91 -31
- package/tempo/AuthorizationTempo/package.json +6 -0
- package/tempo/AuthorizationTempo.test.ts +1293 -0
- package/tempo/AuthorizationTempo.ts +884 -0
- package/tempo/KeyAuthorization/package.json +6 -0
- package/tempo/KeyAuthorization.test.ts +1373 -0
- package/tempo/KeyAuthorization.ts +622 -0
- package/tempo/PoolId/package.json +6 -0
- package/tempo/PoolId.test.ts +33 -0
- package/tempo/PoolId.ts +42 -0
- package/tempo/SignatureEnvelope/package.json +6 -0
- package/tempo/SignatureEnvelope.test.ts +1877 -0
- package/tempo/SignatureEnvelope.ts +973 -0
- package/tempo/Tick/package.json +6 -0
- package/tempo/Tick.test.ts +281 -0
- package/tempo/Tick.ts +186 -0
- package/tempo/TokenId/package.json +6 -0
- package/tempo/TokenId.test.ts +40 -0
- package/tempo/TokenId.ts +80 -0
- package/tempo/TokenRole/package.json +6 -0
- package/tempo/TokenRole.test.ts +16 -0
- package/tempo/TokenRole.ts +45 -0
- package/tempo/Transaction/package.json +6 -0
- package/tempo/Transaction.test.ts +523 -0
- package/tempo/Transaction.ts +339 -0
- package/tempo/TransactionReceipt/package.json +6 -0
- package/tempo/TransactionReceipt.ts +200 -0
- package/tempo/TransactionRequest/package.json +6 -0
- package/tempo/TransactionRequest.ts +160 -0
- package/tempo/TxEnvelopeTempo/package.json +6 -0
- package/tempo/TxEnvelopeTempo.test.ts +1371 -0
- package/tempo/TxEnvelopeTempo.ts +972 -0
- package/tempo/e2e.test.ts +1387 -0
- package/tempo/index.ts +308 -0
- package/tempo/package.json +6 -0
- package/version.ts +1 -1
- package/TransactionEnvelope/package.json +0 -6
- package/TransactionEnvelopeEip1559/package.json +0 -6
- package/TransactionEnvelopeEip2930/package.json +0 -6
- package/TransactionEnvelopeEip4844/package.json +0 -6
- package/TransactionEnvelopeEip7702/package.json +0 -6
- package/TransactionEnvelopeLegacy/package.json +0 -6
- package/_cjs/core/TransactionEnvelope.js.map +0 -1
- package/_cjs/core/TransactionEnvelopeEip1559.js.map +0 -1
- package/_cjs/core/TransactionEnvelopeEip2930.js.map +0 -1
- package/_cjs/core/TransactionEnvelopeEip4844.js.map +0 -1
- package/_cjs/core/TransactionEnvelopeEip7702.js.map +0 -1
- package/_cjs/core/TransactionEnvelopeLegacy.js.map +0 -1
- package/_esm/core/TransactionEnvelope.js.map +0 -1
- package/_esm/core/TransactionEnvelopeEip1559.js.map +0 -1
- package/_esm/core/TransactionEnvelopeEip2930.js.map +0 -1
- package/_esm/core/TransactionEnvelopeEip4844.js.map +0 -1
- package/_esm/core/TransactionEnvelopeEip7702.js.map +0 -1
- package/_esm/core/TransactionEnvelopeLegacy.js.map +0 -1
- package/_types/core/TransactionEnvelope.d.ts.map +0 -1
- package/_types/core/TransactionEnvelopeEip1559.d.ts.map +0 -1
- package/_types/core/TransactionEnvelopeEip2930.d.ts.map +0 -1
- package/_types/core/TransactionEnvelopeEip4844.d.ts.map +0 -1
- package/_types/core/TransactionEnvelopeEip7702.d.ts.map +0 -1
- package/_types/core/TransactionEnvelopeLegacy.d.ts.map +0 -1
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import * as Errors from '../core/Errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Minimum allowed tick value (-2% from peg).
|
|
4
|
+
*
|
|
5
|
+
* [Stablecoin DEX Pricing](https://docs.tempo.xyz/protocol/exchange/spec#key-concepts)
|
|
6
|
+
*/
|
|
7
|
+
export const minTick = -2000;
|
|
8
|
+
/**
|
|
9
|
+
* Maximum allowed tick value (+2% from peg).
|
|
10
|
+
*
|
|
11
|
+
* [Stablecoin DEX Pricing](https://docs.tempo.xyz/protocol/exchange/spec#key-concepts)
|
|
12
|
+
*/
|
|
13
|
+
export const maxTick = 2000;
|
|
14
|
+
/**
|
|
15
|
+
* Price scaling factor (5 decimal places for 0.1 bps precision).
|
|
16
|
+
*
|
|
17
|
+
* The DEX uses a tick-based pricing system where `price = PRICE_SCALE + tick`.
|
|
18
|
+
* Orders must be placed at ticks divisible by `TICK_SPACING = 10` (1 bp grid).
|
|
19
|
+
*
|
|
20
|
+
* [Stablecoin DEX Pricing](https://docs.tempo.xyz/protocol/exchange/spec#key-concepts)
|
|
21
|
+
*/
|
|
22
|
+
export const priceScale = 100_000;
|
|
23
|
+
/**
|
|
24
|
+
* Converts a tick to a price string.
|
|
25
|
+
*
|
|
26
|
+
* [Stablecoin DEX Pricing](https://docs.tempo.xyz/protocol/exchange/spec#key-concepts)
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { Tick } from 'ox/tempo'
|
|
31
|
+
*
|
|
32
|
+
* // Tick 0 = price of 1.0
|
|
33
|
+
* const price1 = Tick.toPrice(0) // "1"
|
|
34
|
+
*
|
|
35
|
+
* // Tick 100 = price of 1.001 (0.1% higher)
|
|
36
|
+
* const price2 = Tick.toPrice(100) // "1.001"
|
|
37
|
+
*
|
|
38
|
+
* // Tick -100 = price of 0.999 (0.1% lower)
|
|
39
|
+
* const price3 = Tick.toPrice(-100) // "0.999"
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @param tick - The tick value (range: -2000 to +2000).
|
|
43
|
+
* @returns The price as a string with exact decimal representation.
|
|
44
|
+
* @throws `TickOutOfBoundsError` If tick is out of bounds.
|
|
45
|
+
*/
|
|
46
|
+
export function toPrice(tick) {
|
|
47
|
+
if (tick < minTick || tick > maxTick) {
|
|
48
|
+
throw new TickOutOfBoundsError({ tick });
|
|
49
|
+
}
|
|
50
|
+
// Use integer arithmetic to avoid floating point errors
|
|
51
|
+
const price = priceScale + tick;
|
|
52
|
+
const whole = Math.floor(price / priceScale);
|
|
53
|
+
let decimal = (price % priceScale).toString().padStart(5, '0');
|
|
54
|
+
decimal = decimal.replace(/0+$/, '');
|
|
55
|
+
if (decimal.length === 0)
|
|
56
|
+
return whole.toString();
|
|
57
|
+
return `${whole}.${decimal}`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Converts a price string to a tick.
|
|
61
|
+
*
|
|
62
|
+
* [Stablecoin DEX Pricing](https://docs.tempo.xyz/protocol/exchange/spec#key-concepts)
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```ts
|
|
66
|
+
* import { Tick } from 'ox/tempo'
|
|
67
|
+
*
|
|
68
|
+
* // Price of 1.0 = tick 0
|
|
69
|
+
* const tick1 = Tick.fromPrice('1.0') // 0
|
|
70
|
+
* const tick2 = Tick.fromPrice('1.00000') // 0
|
|
71
|
+
*
|
|
72
|
+
* // Price of 1.001 = tick 100
|
|
73
|
+
* const tick3 = Tick.fromPrice('1.001') // 100
|
|
74
|
+
*
|
|
75
|
+
* // Price of 0.999 = tick -100
|
|
76
|
+
* const tick4 = Tick.fromPrice('0.999') // -100
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* @param price - The price as a string (e.g., "1.001", "0.999").
|
|
80
|
+
* @returns The tick value.
|
|
81
|
+
*/
|
|
82
|
+
export function fromPrice(price) {
|
|
83
|
+
const priceStr = price.trim();
|
|
84
|
+
if (!/^-?\d+(\.\d+)?$/.test(priceStr))
|
|
85
|
+
throw new InvalidPriceFormatError({ price });
|
|
86
|
+
// Parse price using string manipulation to avoid float precision issues
|
|
87
|
+
const [w, d = '0'] = priceStr.split('.');
|
|
88
|
+
const whole = BigInt(w);
|
|
89
|
+
// Pad or truncate decimal to exactly 5 digits
|
|
90
|
+
const decimal = BigInt(d.padEnd(5, '0').slice(0, 5));
|
|
91
|
+
// Calculate price
|
|
92
|
+
const priceInt = whole * BigInt(priceScale) + decimal;
|
|
93
|
+
// Calculate tick
|
|
94
|
+
const tick = Number(priceInt - BigInt(priceScale));
|
|
95
|
+
if (tick < minTick || tick > maxTick)
|
|
96
|
+
throw new PriceOutOfBoundsError({ price, tick });
|
|
97
|
+
return tick;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Error thrown when a tick value is out of the allowed bounds.
|
|
101
|
+
*/
|
|
102
|
+
export class TickOutOfBoundsError extends Errors.BaseError {
|
|
103
|
+
constructor(options) {
|
|
104
|
+
super(`Tick ${options.tick} is out of bounds.`, {
|
|
105
|
+
metaMessages: [`Tick must be between ${minTick} and ${maxTick}.`],
|
|
106
|
+
});
|
|
107
|
+
Object.defineProperty(this, "name", {
|
|
108
|
+
enumerable: true,
|
|
109
|
+
configurable: true,
|
|
110
|
+
writable: true,
|
|
111
|
+
value: 'Tick.TickOutOfBoundsError'
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Error thrown when a price string has an invalid format.
|
|
117
|
+
*/
|
|
118
|
+
export class InvalidPriceFormatError extends Errors.BaseError {
|
|
119
|
+
constructor(options) {
|
|
120
|
+
super(`Invalid price format: "${options.price}".`, {
|
|
121
|
+
metaMessages: ['Price must be a decimal number string (e.g., "1.001").'],
|
|
122
|
+
});
|
|
123
|
+
Object.defineProperty(this, "name", {
|
|
124
|
+
enumerable: true,
|
|
125
|
+
configurable: true,
|
|
126
|
+
writable: true,
|
|
127
|
+
value: 'Tick.InvalidPriceFormatError'
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Error thrown when a price string results in an out-of-bounds tick.
|
|
133
|
+
*/
|
|
134
|
+
export class PriceOutOfBoundsError extends Errors.BaseError {
|
|
135
|
+
constructor(options) {
|
|
136
|
+
super(`Price "${options.price}" results in tick ${options.tick} which is out of bounds.`, {
|
|
137
|
+
metaMessages: [`Tick must be between ${minTick} and ${maxTick}.`],
|
|
138
|
+
});
|
|
139
|
+
Object.defineProperty(this, "name", {
|
|
140
|
+
enumerable: true,
|
|
141
|
+
configurable: true,
|
|
142
|
+
writable: true,
|
|
143
|
+
value: 'Tick.PriceOutOfBoundsError'
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=Tick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tick.js","sourceRoot":"","sources":["../../tempo/Tick.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as Address from '../core/Address.js';
|
|
2
|
+
import * as Hex from '../core/Hex.js';
|
|
3
|
+
const tip20Prefix = '0x20c0';
|
|
4
|
+
/**
|
|
5
|
+
* Converts a token ID or address to a token ID.
|
|
6
|
+
*
|
|
7
|
+
* TIP-20 is Tempo's native token standard for stablecoins with deterministic addresses
|
|
8
|
+
* derived from sequential token IDs (prefix `0x20c0`).
|
|
9
|
+
*
|
|
10
|
+
* [TIP-20 Token Standard](https://docs.tempo.xyz/protocol/tip20/overview)
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts twoslash
|
|
14
|
+
* import { TokenId } from 'ox/tempo'
|
|
15
|
+
*
|
|
16
|
+
* const tokenId = TokenId.from(1n)
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @param tokenIdOrAddress - The token ID or address.
|
|
20
|
+
* @returns The token ID.
|
|
21
|
+
*/
|
|
22
|
+
export function from(tokenIdOrAddress) {
|
|
23
|
+
if (typeof tokenIdOrAddress === 'bigint' ||
|
|
24
|
+
typeof tokenIdOrAddress === 'number')
|
|
25
|
+
return BigInt(tokenIdOrAddress);
|
|
26
|
+
return fromAddress(tokenIdOrAddress);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Converts a TIP-20 token address to a token ID.
|
|
30
|
+
*
|
|
31
|
+
* [TIP-20 Token Standard](https://docs.tempo.xyz/protocol/tip20/overview)
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts twoslash
|
|
35
|
+
* import { TokenId } from 'ox/tempo'
|
|
36
|
+
*
|
|
37
|
+
* const tokenId = TokenId.fromAddress('0x20c00000000000000000000000000000000000000001')
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @param address - The token address.
|
|
41
|
+
* @returns The token ID.
|
|
42
|
+
*/
|
|
43
|
+
export function fromAddress(address) {
|
|
44
|
+
if (!address.toLowerCase().startsWith(tip20Prefix))
|
|
45
|
+
throw new Error('invalid tip20 address.');
|
|
46
|
+
return Hex.toBigInt(Hex.slice(address, tip20Prefix.length));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Converts a TIP-20 token ID to an address.
|
|
50
|
+
*
|
|
51
|
+
* [TIP-20 Token Standard](https://docs.tempo.xyz/protocol/tip20/overview)
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts twoslash
|
|
55
|
+
* import { TokenId } from 'ox/tempo'
|
|
56
|
+
*
|
|
57
|
+
* const address = TokenId.toAddress(1n)
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* @param tokenId - The token ID.
|
|
61
|
+
* @returns The address.
|
|
62
|
+
*/
|
|
63
|
+
export function toAddress(tokenId) {
|
|
64
|
+
if (typeof tokenId === 'string') {
|
|
65
|
+
Address.assert(tokenId);
|
|
66
|
+
return tokenId;
|
|
67
|
+
}
|
|
68
|
+
const tokenIdHex = Hex.fromNumber(tokenId, { size: 18 });
|
|
69
|
+
return Hex.concat(tip20Prefix, tokenIdHex);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=TokenId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenId.js","sourceRoot":"","sources":["../../tempo/TokenId.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAA;AAErC,MAAM,WAAW,GAAG,QAAQ,CAAA;AAK5B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,IAAI,CAAC,gBAA2C;IAC9D,IACE,OAAO,gBAAgB,KAAK,QAAQ;QACpC,OAAO,gBAAgB,KAAK,QAAQ;QAEpC,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAA;IACjC,OAAO,WAAW,CAAC,gBAAgB,CAAC,CAAA;AACtC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CAAC,OAAwB;IAClD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC3C,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,SAAS,CAAC,OAAyB;IACjD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACvB,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;IACxD,OAAO,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;AAC5C,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as Hash from '../core/Hash.js';
|
|
2
|
+
import * as Hex from '../core/Hex.js';
|
|
3
|
+
export const roles = [
|
|
4
|
+
'defaultAdmin',
|
|
5
|
+
'pause',
|
|
6
|
+
'unpause',
|
|
7
|
+
'issuer',
|
|
8
|
+
'burnBlocked',
|
|
9
|
+
];
|
|
10
|
+
export const toPreHashed = {
|
|
11
|
+
defaultAdmin: 'DEFAULT_ADMIN_ROLE',
|
|
12
|
+
pause: 'PAUSE_ROLE',
|
|
13
|
+
unpause: 'UNPAUSE_ROLE',
|
|
14
|
+
issuer: 'ISSUER_ROLE',
|
|
15
|
+
burnBlocked: 'BURN_BLOCKED_ROLE',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Serializes a token role to its keccak256 hash representation.
|
|
19
|
+
*
|
|
20
|
+
* TIP-20 includes a built-in RBAC system with roles like `ISSUER_ROLE` (mint/burn),
|
|
21
|
+
* `PAUSE_ROLE`/`UNPAUSE_ROLE` (emergency controls), and `BURN_BLOCKED_ROLE` (compliance).
|
|
22
|
+
*
|
|
23
|
+
* [TIP-20 RBAC](https://docs.tempo.xyz/protocol/tip20/overview#role-based-access-control-rbac)
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts twoslash
|
|
27
|
+
* import { TokenRole } from 'ox/tempo'
|
|
28
|
+
*
|
|
29
|
+
* const hash = TokenRole.serialize('issuer')
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @param role - The token role to serialize.
|
|
33
|
+
* @returns The keccak256 hash of the role.
|
|
34
|
+
*/
|
|
35
|
+
export function serialize(role) {
|
|
36
|
+
if (role === 'defaultAdmin')
|
|
37
|
+
return '0x0000000000000000000000000000000000000000000000000000000000000000';
|
|
38
|
+
return Hash.keccak256(Hex.fromString(toPreHashed[role] ?? role));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=TokenRole.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenRole.js","sourceRoot":"","sources":["../../tempo/TokenRole.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAA;AACvC,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAA;AAErC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,cAAc;IACd,OAAO;IACP,SAAS;IACT,QAAQ;IACR,aAAa;CACL,CAAA;AAGV,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY,EAAE,oBAAoB;IAClC,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,aAAa;IACrB,WAAW,EAAE,mBAAmB;CACY,CAAA;AAE9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,SAAS,CAAC,IAAe;IACvC,IAAI,IAAI,KAAK,cAAc;QACzB,OAAO,oEAAoE,CAAA;IAC7E,OAAO,IAAI,CAAC,SAAS,CACnB,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,IAAgC,CAAC,IAAI,IAAI,CAAC,CACtE,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import * as Hex from '../core/Hex.js';
|
|
2
|
+
import * as Signature from '../core/Signature.js';
|
|
3
|
+
import * as ox_Transaction from '../core/Transaction.js';
|
|
4
|
+
import * as AuthorizationTempo from './AuthorizationTempo.js';
|
|
5
|
+
import * as KeyAuthorization from './KeyAuthorization.js';
|
|
6
|
+
import * as SignatureEnvelope from './SignatureEnvelope.js';
|
|
7
|
+
/** Type to RPC Type mapping. */
|
|
8
|
+
export const toRpcType = {
|
|
9
|
+
...ox_Transaction.toRpcType,
|
|
10
|
+
tempo: '0x76',
|
|
11
|
+
};
|
|
12
|
+
/** RPC Type to Type mapping. */
|
|
13
|
+
export const fromRpcType = {
|
|
14
|
+
...ox_Transaction.fromRpcType,
|
|
15
|
+
'0x76': 'tempo',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Converts an {@link ox#Transaction.Rpc} to an {@link ox#Transaction.Transaction}.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts twoslash
|
|
22
|
+
* import { Transaction } from 'ox/tempo'
|
|
23
|
+
*
|
|
24
|
+
* const transaction = Transaction.fromRpc({
|
|
25
|
+
* hash: '0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0',
|
|
26
|
+
* nonce: '0x357',
|
|
27
|
+
* blockHash:
|
|
28
|
+
* '0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b',
|
|
29
|
+
* blockNumber: '0x12f296f',
|
|
30
|
+
* calls: [
|
|
31
|
+
* {
|
|
32
|
+
* input: '0xdeadbeef',
|
|
33
|
+
* to: '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad',
|
|
34
|
+
* value: '0x9b6e64a8ec60000',
|
|
35
|
+
* },
|
|
36
|
+
* ],
|
|
37
|
+
* feeToken: '0x20c0000000000000000000000000000000000000',
|
|
38
|
+
* transactionIndex: '0x2',
|
|
39
|
+
* from: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',
|
|
40
|
+
* value: '0x9b6e64a8ec60000',
|
|
41
|
+
* gas: '0x43f5d',
|
|
42
|
+
* maxFeePerGas: '0x2ca6ae494',
|
|
43
|
+
* maxPriorityFeePerGas: '0x41cc3c0',
|
|
44
|
+
* input:
|
|
45
|
+
* '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000006643504700000000000000000000000000000000000000000000000000000000000000040b080604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000009b6e64a8ec600000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000009b6e64a8ec60000000000000000000000000000000000000000000000000000019124bb5ae978c000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b8000000000000000000000000000000fee13a103a10d593b9ae06b3e05f2e7e1c00000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000190240001b9872b',
|
|
46
|
+
* signature: {
|
|
47
|
+
* r: '0x635dc2033e60185bb36709c29c75d64ea51dfbd91c32ef4be198e4ceb169fb4d',
|
|
48
|
+
* s: '0x50c2667ac4c771072746acfdcf1f1483336dcca8bd2df47cd83175dbe60f0540',
|
|
49
|
+
* type: 'secp256k1',
|
|
50
|
+
* yParity: '0x0',
|
|
51
|
+
* },
|
|
52
|
+
* chainId: '0x1',
|
|
53
|
+
* accessList: [],
|
|
54
|
+
* type: '0x76',
|
|
55
|
+
* })
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @param transaction - The RPC transaction to convert.
|
|
59
|
+
* @returns An instantiated {@link ox#Transaction.Transaction}.
|
|
60
|
+
*/
|
|
61
|
+
export function fromRpc(transaction, _options = {}) {
|
|
62
|
+
if (!transaction)
|
|
63
|
+
return null;
|
|
64
|
+
const transaction_ = ox_Transaction.fromRpc(transaction);
|
|
65
|
+
transaction_.type = fromRpcType[transaction.type];
|
|
66
|
+
if (transaction.aaAuthorizationList) {
|
|
67
|
+
transaction_.authorizationList = AuthorizationTempo.fromRpcList(transaction.aaAuthorizationList);
|
|
68
|
+
delete transaction_.aaAuthorizationList;
|
|
69
|
+
}
|
|
70
|
+
if (transaction.calls)
|
|
71
|
+
transaction_.calls = transaction.calls.map((call) => ({
|
|
72
|
+
to: call.to,
|
|
73
|
+
value: call.value && call.value !== '0x' ? BigInt(call.value) : undefined,
|
|
74
|
+
// @ts-expect-error
|
|
75
|
+
data: call.input || call.data || '0x',
|
|
76
|
+
}));
|
|
77
|
+
if (transaction.feeToken)
|
|
78
|
+
transaction_.feeToken = transaction.feeToken;
|
|
79
|
+
if (transaction.nonceKey)
|
|
80
|
+
transaction_.nonceKey = BigInt(transaction.nonceKey);
|
|
81
|
+
if (transaction.signature)
|
|
82
|
+
transaction_.signature = SignatureEnvelope.fromRpc(transaction.signature);
|
|
83
|
+
if (transaction.validAfter)
|
|
84
|
+
transaction_.validAfter = Number(transaction.validAfter);
|
|
85
|
+
if (transaction.validBefore)
|
|
86
|
+
transaction_.validBefore = Number(transaction.validBefore);
|
|
87
|
+
if (transaction.keyAuthorization)
|
|
88
|
+
transaction_.keyAuthorization = KeyAuthorization.fromRpc(transaction.keyAuthorization);
|
|
89
|
+
if (transaction.feePayerSignature) {
|
|
90
|
+
transaction_.feePayerSignature = Signature.fromRpc(transaction.feePayerSignature);
|
|
91
|
+
transaction_.feePayerSignature.v = Signature.yParityToV(transaction_.feePayerSignature.yParity);
|
|
92
|
+
}
|
|
93
|
+
return transaction_;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Converts an {@link ox#Transaction.Transaction} to an {@link ox#Transaction.Rpc}.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts twoslash
|
|
100
|
+
* import { Transaction } from 'ox/tempo'
|
|
101
|
+
*
|
|
102
|
+
* const transaction = Transaction.toRpc({
|
|
103
|
+
* accessList: [],
|
|
104
|
+
* blockHash:
|
|
105
|
+
* '0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b',
|
|
106
|
+
* blockNumber: 19868015n,
|
|
107
|
+
* calls: [
|
|
108
|
+
* {
|
|
109
|
+
* data: '0xdeadbeef',
|
|
110
|
+
* to: '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad',
|
|
111
|
+
* value: 700000000000000000n,
|
|
112
|
+
* },
|
|
113
|
+
* ],
|
|
114
|
+
* chainId: 1,
|
|
115
|
+
* feeToken: '0x20c0000000000000000000000000000000000000',
|
|
116
|
+
* from: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',
|
|
117
|
+
* gas: 278365n,
|
|
118
|
+
* hash: '0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0',
|
|
119
|
+
* input:
|
|
120
|
+
* '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000006643504700000000000000000000000000000000000000000000000000000000000000040b080604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000009b6e64a8ec600000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000009b6e64a8ec60000000000000000000000000000000000000000000000000000019124bb5ae978c000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b8000000000000000000000000000000fee13a103a10d593b9ae06b3e05f2e7e1c00000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000190240001b9872b',
|
|
121
|
+
* maxFeePerGas: 11985937556n,
|
|
122
|
+
* maxPriorityFeePerGas: 68993984n,
|
|
123
|
+
* nonce: 855n,
|
|
124
|
+
* signature: {
|
|
125
|
+
* signature: {
|
|
126
|
+
* r: 44944627813007772897391531230081695102703289123332187696115181104739239197517n,
|
|
127
|
+
* s: 36528503505192438307355164441104001310566505351980369085208178712678799181120n,
|
|
128
|
+
* yParity: 0,
|
|
129
|
+
* },
|
|
130
|
+
* type: 'secp256k1',
|
|
131
|
+
* },
|
|
132
|
+
* transactionIndex: 2,
|
|
133
|
+
* type: 'tempo',
|
|
134
|
+
* })
|
|
135
|
+
* ```
|
|
136
|
+
*
|
|
137
|
+
* @param transaction - The transaction to convert.
|
|
138
|
+
* @returns An RPC-formatted transaction.
|
|
139
|
+
*/
|
|
140
|
+
export function toRpc(transaction, _options) {
|
|
141
|
+
const rpc = ox_Transaction.toRpc(transaction);
|
|
142
|
+
rpc.type = toRpcType[transaction.type];
|
|
143
|
+
if (transaction.authorizationList)
|
|
144
|
+
rpc.aaAuthorizationList = AuthorizationTempo.toRpcList(transaction.authorizationList);
|
|
145
|
+
if (transaction.calls)
|
|
146
|
+
rpc.calls = transaction.calls.map((call) => ({
|
|
147
|
+
to: call.to,
|
|
148
|
+
value: call.value ? Hex.fromNumber(call.value) : undefined,
|
|
149
|
+
data: call.data,
|
|
150
|
+
}));
|
|
151
|
+
if (transaction.feeToken)
|
|
152
|
+
rpc.feeToken = transaction.feeToken;
|
|
153
|
+
if (transaction.keyAuthorization)
|
|
154
|
+
rpc.keyAuthorization = KeyAuthorization.toRpc(transaction.keyAuthorization);
|
|
155
|
+
if (transaction.feePayerSignature) {
|
|
156
|
+
rpc.feePayerSignature = Signature.toRpc(transaction.feePayerSignature);
|
|
157
|
+
rpc.feePayerSignature.v = Hex.fromNumber(Signature.yParityToV(transaction.feePayerSignature?.yParity));
|
|
158
|
+
}
|
|
159
|
+
if (transaction.signature)
|
|
160
|
+
rpc.signature = SignatureEnvelope.toRpc(transaction.signature);
|
|
161
|
+
if (typeof transaction.validAfter === 'number')
|
|
162
|
+
rpc.validAfter = Hex.fromNumber(transaction.validAfter);
|
|
163
|
+
if (typeof transaction.validBefore === 'number')
|
|
164
|
+
rpc.validBefore = Hex.fromNumber(transaction.validBefore);
|
|
165
|
+
return rpc;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=Transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transaction.js","sourceRoot":"","sources":["../../tempo/Transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import * as ox_TransactionReceipt from '../core/TransactionReceipt.js';
|
|
2
|
+
/** RPC type to type mapping. */
|
|
3
|
+
export const fromRpcType = {
|
|
4
|
+
...ox_TransactionReceipt.fromRpcType,
|
|
5
|
+
'0x76': 'tempo',
|
|
6
|
+
};
|
|
7
|
+
/** Type to RPC type mapping. */
|
|
8
|
+
export const toRpcType = {
|
|
9
|
+
...ox_TransactionReceipt.toRpcType,
|
|
10
|
+
tempo: '0x76',
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Converts an RPC receipt to a TransactionReceipt.
|
|
14
|
+
*
|
|
15
|
+
* @see {@link https://docs.tempo.xyz/protocol/transactions Tempo Transactions}
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts twoslash
|
|
19
|
+
* import { TransactionReceipt } from 'ox/tempo'
|
|
20
|
+
*
|
|
21
|
+
* const receipt = TransactionReceipt.fromRpc({
|
|
22
|
+
* blobGasPrice: '0x42069',
|
|
23
|
+
* blobGasUsed: '0x1337',
|
|
24
|
+
* blockHash:
|
|
25
|
+
* '0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b',
|
|
26
|
+
* blockNumber: '0x12f296f',
|
|
27
|
+
* contractAddress: null,
|
|
28
|
+
* cumulativeGasUsed: '0x82515',
|
|
29
|
+
* effectiveGasPrice: '0x21c2f6c09',
|
|
30
|
+
* feePayer: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',
|
|
31
|
+
* feeToken: '0x20c0000000000000000000000000000000000001',
|
|
32
|
+
* from: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',
|
|
33
|
+
* gasUsed: '0x2abba',
|
|
34
|
+
* logs: [],
|
|
35
|
+
* logsBloom:
|
|
36
|
+
* '0x00200000000000000000008080000000000000000040000000000000000000000000000000000000000000000000000022000000080000000000000000000000000000080000000000000008000000200000000000000000000200008020400000000000000000280000000000100000000000000000000000000010000000000000000000020000000000000020000000000001000000080000004000000000000000000000000000000000000000000000400000000000001000000000000000000002000000000000000020000000000000000000001000000000000000000000200000000000000000000000000000001000000000c00000000000000000',
|
|
37
|
+
* status: '0x1',
|
|
38
|
+
* to: '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad',
|
|
39
|
+
* transactionHash:
|
|
40
|
+
* '0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0',
|
|
41
|
+
* transactionIndex: '0x2',
|
|
42
|
+
* type: '0x2',
|
|
43
|
+
* })
|
|
44
|
+
* // @log: {
|
|
45
|
+
* // @log: blobGasPrice: 270441n,
|
|
46
|
+
* // @log: blobGasUsed: 4919n,
|
|
47
|
+
* // @log: blockHash: "0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b",
|
|
48
|
+
* // @log: blockNumber: 19868015n,
|
|
49
|
+
* // @log: contractAddress: null,
|
|
50
|
+
* // @log: cumulativeGasUsed: 533781n,
|
|
51
|
+
* // @log: effectiveGasPrice: 9062804489n,
|
|
52
|
+
* // @log: feePayer: "0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6",
|
|
53
|
+
* // @log: feeToken: "0x20c0000000000000000000000000000000000001",
|
|
54
|
+
* // @log: from: "0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6",
|
|
55
|
+
* // @log: gasUsed: 175034n,
|
|
56
|
+
* // @log: logs: [],
|
|
57
|
+
* // @log: logsBloom: "0x00200000000000000000008080000000000000000040000000000000000000000000000000000000000000000000000022000000080000000000000000000000000000080000000000000008000000200000000000000000000200008020400000000000000000280000000000100000000000000000000000000010000000000000000000020000000000000020000000000001000000080000004000000000000000000000000000000000000000000000400000000000001000000000000000000002000000000000000020000000000000000000001000000000000000000000200000000000000000000000000000001000000000c00000000000000000",
|
|
58
|
+
* // @log: root: undefined,
|
|
59
|
+
* // @log: status: "success",
|
|
60
|
+
* // @log: to: "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad",
|
|
61
|
+
* // @log: transactionHash: "0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0",
|
|
62
|
+
* // @log: transactionIndex: 2,
|
|
63
|
+
* // @log: type: "eip1559",
|
|
64
|
+
* // @log: }
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* @param receipt - The RPC receipt to convert.
|
|
68
|
+
* @returns A TransactionReceipt.
|
|
69
|
+
*/
|
|
70
|
+
export function fromRpc(receipt) {
|
|
71
|
+
return ox_TransactionReceipt.fromRpc(receipt);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Converts a TransactionReceipt to an RPC receipt.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts twoslash
|
|
78
|
+
* import { TransactionReceipt } from 'ox/tempo'
|
|
79
|
+
*
|
|
80
|
+
* const receipt = TransactionReceipt.toRpc({
|
|
81
|
+
* blobGasPrice: 270441n,
|
|
82
|
+
* blobGasUsed: 4919n,
|
|
83
|
+
* blockHash:
|
|
84
|
+
* '0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b',
|
|
85
|
+
* blockNumber: 19868015n,
|
|
86
|
+
* contractAddress: null,
|
|
87
|
+
* cumulativeGasUsed: 533781n,
|
|
88
|
+
* effectiveGasPrice: 9062804489n,
|
|
89
|
+
* feePayer: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',
|
|
90
|
+
* feeToken: '0x20c0000000000000000000000000000000000001',
|
|
91
|
+
* from: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',
|
|
92
|
+
* gasUsed: 175034n,
|
|
93
|
+
* logs: [],
|
|
94
|
+
* logsBloom:
|
|
95
|
+
* '0x00200000000000000000008080000000000000000040000000000000000000000000000000000000000000000000000022000000080000000000000000000000000000080000000000000008000000200000000000000000000200008020400000000000000000280000000000100000000000000000000000000010000000000000000000020000000000000020000000000001000000080000004000000000000000000000000000000000000000000000400000000000001000000000000000000002000000000000000020000000000000000000001000000000000000000000200000000000000000000000000000001000000000c00000000000000000',
|
|
96
|
+
* root: undefined,
|
|
97
|
+
* status: 'success',
|
|
98
|
+
* to: '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad',
|
|
99
|
+
* transactionHash:
|
|
100
|
+
* '0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0',
|
|
101
|
+
* transactionIndex: 2,
|
|
102
|
+
* type: 'eip1559',
|
|
103
|
+
* })
|
|
104
|
+
* // @log: {
|
|
105
|
+
* // @log: blobGasPrice: "0x042069",
|
|
106
|
+
* // @log: blobGasUsed: "0x1337",
|
|
107
|
+
* // @log: blockHash: "0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b",
|
|
108
|
+
* // @log: blockNumber: "0x012f296f",
|
|
109
|
+
* // @log: contractAddress: null,
|
|
110
|
+
* // @log: cumulativeGasUsed: "0x082515",
|
|
111
|
+
* // @log: effectiveGasPrice: "0x021c2f6c09",
|
|
112
|
+
* // @log: feePayer: "0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6",
|
|
113
|
+
* // @log: feeToken: "0x20c0000000000000000000000000000000000001",
|
|
114
|
+
* // @log: from: "0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6",
|
|
115
|
+
* // @log: gasUsed: "0x02abba",
|
|
116
|
+
* // @log: logs: [],
|
|
117
|
+
* // @log: logsBloom: "0x00200000000000000000008080000000000000000040000000000000000000000000000000000000000000000000000022000000080000000000000000000000000000080000000000000008000000200000000000000000000200008020400000000000000000280000000000100000000000000000000000000010000000000000000000020000000000000020000000000001000000080000004000000000000000000000000000000000000000000000400000000000001000000000000000000002000000000000000020000000000000000000001000000000000000000000200000000000000000000000000000001000000000c00000000000000000",
|
|
118
|
+
* // @log: root: undefined,
|
|
119
|
+
* // @log: status: "0x1",
|
|
120
|
+
* // @log: to: "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad",
|
|
121
|
+
* // @log: transactionHash: "0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0",
|
|
122
|
+
* // @log: transactionIndex: "0x02",
|
|
123
|
+
* // @log: type: "eip1559",
|
|
124
|
+
* // @log: }
|
|
125
|
+
* ```
|
|
126
|
+
*
|
|
127
|
+
* @param receipt - The receipt to convert.
|
|
128
|
+
* @returns An RPC receipt.
|
|
129
|
+
*/
|
|
130
|
+
export function toRpc(receipt) {
|
|
131
|
+
const rpc = ox_TransactionReceipt.toRpc(receipt);
|
|
132
|
+
return {
|
|
133
|
+
...rpc,
|
|
134
|
+
feePayer: receipt.feePayer,
|
|
135
|
+
feeToken: receipt.feeToken,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=TransactionReceipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransactionReceipt.js","sourceRoot":"","sources":["../../tempo/TransactionReceipt.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,qBAAqB,MAAM,+BAA+B,CAAA;AA4CtE,gCAAgC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,GAAG,qBAAqB,CAAC,WAAW;IACpC,MAAM,EAAE,OAAO;CACP,CAAA;AAEV,gCAAgC;AAChC,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,GAAG,qBAAqB,CAAC,SAAS;IAClC,KAAK,EAAE,MAAM;CACL,CAAA;AAEV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,MAAM,UAAU,OAAO,CACrB,OAA6B;IAE7B,OAAO,qBAAqB,CAAC,OAAO,CAClC,OAAoC,CAC5B,CAAA;AACZ,CAAC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,MAAM,UAAU,KAAK,CAAC,OAA2B;IAC/C,MAAM,GAAG,GAAG,qBAAqB,CAAC,KAAK,CACrC,OAAmD,CAC7C,CAAA;IACR,OAAO;QACL,GAAG,GAAG;QACN,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAA;AACH,CAAC"}
|