@fastish/contracts 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.
- package/LICENSE +648 -0
- package/README.md +134 -0
- package/contracts/Blocks.sol +73 -0
- package/contracts/Commands.sol +47 -0
- package/contracts/Core.sol +10 -0
- package/contracts/Events.sol +18 -0
- package/contracts/Schema.sol +57 -0
- package/contracts/Utils.sol +105 -0
- package/contracts/blocks/Data.sol +646 -0
- package/contracts/blocks/Errors.sol +10 -0
- package/contracts/blocks/Mem.sol +122 -0
- package/contracts/blocks/Readers.sol +938 -0
- package/contracts/blocks/Schema.sol +148 -0
- package/contracts/blocks/Writers.sol +187 -0
- package/contracts/combinators/AmountToBalance.sol +26 -0
- package/contracts/combinators/AmountToCustody.sol +37 -0
- package/contracts/combinators/CustodyToBalance.sol +27 -0
- package/contracts/combinators/EachRoute.sol +19 -0
- package/contracts/combinators/MapBalance.sol +26 -0
- package/contracts/combinators/MapCustody.sol +26 -0
- package/contracts/combinators/RouteToBalance.sol +27 -0
- package/contracts/commands/Base.sol +39 -0
- package/contracts/commands/Borrow.sol +86 -0
- package/contracts/commands/Burn.sol +32 -0
- package/contracts/commands/Create.sol +31 -0
- package/contracts/commands/CreditTo.sol +36 -0
- package/contracts/commands/DebitFrom.sol +44 -0
- package/contracts/commands/Deposit.sol +46 -0
- package/contracts/commands/Fund.sol +37 -0
- package/contracts/commands/Liquidate.sol +93 -0
- package/contracts/commands/Liquidity.sol +171 -0
- package/contracts/commands/Mint.sol +41 -0
- package/contracts/commands/Pipe.sol +54 -0
- package/contracts/commands/Provision.sol +48 -0
- package/contracts/commands/Reclaim.sol +46 -0
- package/contracts/commands/Redeem.sol +93 -0
- package/contracts/commands/Remove.sol +31 -0
- package/contracts/commands/Repay.sol +93 -0
- package/contracts/commands/Settle.sol +32 -0
- package/contracts/commands/Stake.sol +114 -0
- package/contracts/commands/Supply.sol +32 -0
- package/contracts/commands/Swap.sol +86 -0
- package/contracts/commands/Transfer.sol +41 -0
- package/contracts/commands/Unstake.sol +49 -0
- package/contracts/commands/Withdraw.sol +37 -0
- package/contracts/commands/admin/Allocate.sol +33 -0
- package/contracts/commands/admin/AllowAssets.sol +34 -0
- package/contracts/commands/admin/Authorize.sol +32 -0
- package/contracts/commands/admin/DenyAssets.sol +34 -0
- package/contracts/commands/admin/Destroy.sol +26 -0
- package/contracts/commands/admin/Init.sol +26 -0
- package/contracts/commands/admin/Relocate.sol +32 -0
- package/contracts/commands/admin/Unauthorize.sol +32 -0
- package/contracts/core/Access.sol +49 -0
- package/contracts/core/Balances.sol +9 -0
- package/contracts/core/Host.sol +25 -0
- package/contracts/core/Operation.sol +32 -0
- package/contracts/core/Validator.sol +31 -0
- package/contracts/events/Access.sol +14 -0
- package/contracts/events/Asset.sol +14 -0
- package/contracts/events/Balance.sol +14 -0
- package/contracts/events/Collateral.sol +15 -0
- package/contracts/events/Command.sol +14 -0
- package/contracts/events/Debt.sol +15 -0
- package/contracts/events/Deposit.sol +14 -0
- package/contracts/events/Emitter.sol +7 -0
- package/contracts/events/Fastish.sol +14 -0
- package/contracts/events/Governed.sol +14 -0
- package/contracts/events/HostAnnounced.sol +14 -0
- package/contracts/events/Listing.sol +14 -0
- package/contracts/events/Peer.sol +14 -0
- package/contracts/events/Quote.sol +14 -0
- package/contracts/events/Withdraw.sol +14 -0
- package/contracts/interfaces/IHostDiscovery.sol +6 -0
- package/contracts/peer/AllowAssets.sol +31 -0
- package/contracts/peer/Base.sol +19 -0
- package/contracts/peer/DenyAssets.sol +31 -0
- package/contracts/peer/Pull.sol +30 -0
- package/contracts/peer/Push.sol +30 -0
- package/contracts/test/TestBlockHelper.sol +256 -0
- package/contracts/test/TestBorrowHost.sol +46 -0
- package/contracts/test/TestBurnHost.sol +28 -0
- package/contracts/test/TestCreateHost.sol +26 -0
- package/contracts/test/TestDiscovery.sol +6 -0
- package/contracts/test/TestECDSA.sol +16 -0
- package/contracts/test/TestHost.sol +215 -0
- package/contracts/test/TestLiquidityHost.sol +149 -0
- package/contracts/test/TestMintHost.sol +40 -0
- package/contracts/test/TestPeerHost.sol +34 -0
- package/contracts/test/TestReclaimHost.sol +47 -0
- package/contracts/test/TestRejectEther.sol +8 -0
- package/contracts/test/TestRemoveHost.sol +26 -0
- package/contracts/test/TestSwapHost.sol +45 -0
- package/contracts/test/TestUtils.sol +180 -0
- package/contracts/test/TestValidator.sol +10 -0
- package/contracts/utils/Accounts.sol +42 -0
- package/contracts/utils/Assets.sol +71 -0
- package/contracts/utils/Channels.sol +9 -0
- package/contracts/utils/ECDSA.sol +36 -0
- package/contracts/utils/Ids.sol +75 -0
- package/contracts/utils/Layout.sol +20 -0
- package/contracts/utils/Strings.sol +16 -0
- package/contracts/utils/Utils.sol +117 -0
- package/contracts/utils/Value.sol +18 -0
- package/package.json +29 -0
|
@@ -0,0 +1,938 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-3.0-only
|
|
2
|
+
pragma solidity ^0.8.33;
|
|
3
|
+
|
|
4
|
+
import {ALLOCATION_KEY, AMOUNT_KEY, ASSET_KEY, AUTH_KEY, AUTH_PROOF_LEN, AUTH_TOTAL_LEN, BALANCE_KEY, BOUNTY_KEY, CUSTODY_KEY, BlockPairRef, BlockRef, DataRef, FUNDING_KEY, Listing, LISTING_KEY, MAXIMUM_KEY, MINIMUM_KEY, NODE_KEY, PARTY_KEY, QUANTITY_KEY, RATE_KEY, RECIPIENT_KEY, ROUTE_KEY, STEP_KEY, TX_KEY, AssetAmount, HostAmount, Tx} from "./Schema.sol";
|
|
5
|
+
import {InvalidBlock, MalformedBlocks, UnexpectedAsset, UnexpectedHost, UnexpectedMeta, ZeroNode, ZeroRecipient} from "./Errors.sol";
|
|
6
|
+
|
|
7
|
+
using Blocks for BlockRef;
|
|
8
|
+
|
|
9
|
+
library Blocks {
|
|
10
|
+
// ── infrastructure ────────────────────────────────────────────────────────
|
|
11
|
+
|
|
12
|
+
function from(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
13
|
+
uint eod = source.length;
|
|
14
|
+
if (i == eod) return BlockRef(bytes4(0), 0, 0, i);
|
|
15
|
+
if (i > eod) revert MalformedBlocks();
|
|
16
|
+
|
|
17
|
+
unchecked {
|
|
18
|
+
ref.i = i + 12;
|
|
19
|
+
}
|
|
20
|
+
if (ref.i > eod) revert MalformedBlocks();
|
|
21
|
+
ref.key = bytes4(source[i:i + 4]);
|
|
22
|
+
ref.bound = ref.i + uint32(bytes4(source[i + 4:i + 8]));
|
|
23
|
+
ref.end = ref.i + uint32(bytes4(source[i + 8:ref.i]));
|
|
24
|
+
|
|
25
|
+
if (ref.bound > ref.end || ref.end > eod) revert MalformedBlocks();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function twoFrom(bytes calldata source, uint i) internal pure returns (BlockPairRef memory ref) {
|
|
29
|
+
ref.a = from(source, i);
|
|
30
|
+
i = ref.a.end;
|
|
31
|
+
ref.b = from(source, i);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function childAt(
|
|
35
|
+
BlockRef memory parent,
|
|
36
|
+
bytes calldata source,
|
|
37
|
+
uint i
|
|
38
|
+
) internal pure returns (BlockRef memory ref) {
|
|
39
|
+
if (i < parent.bound || i >= parent.end) revert MalformedBlocks();
|
|
40
|
+
ref = from(source, i);
|
|
41
|
+
if (ref.end > parent.end) revert MalformedBlocks();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function count(bytes calldata source, uint i, bytes4 key) internal pure returns (uint count_, uint next) {
|
|
45
|
+
next = i;
|
|
46
|
+
while (next < source.length) {
|
|
47
|
+
BlockRef memory ref = from(source, next);
|
|
48
|
+
if (ref.key != key) break;
|
|
49
|
+
unchecked {
|
|
50
|
+
++count_;
|
|
51
|
+
}
|
|
52
|
+
next = ref.end;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function find(bytes calldata source, uint i, uint limit, bytes4 key) internal pure returns (BlockRef memory ref) {
|
|
57
|
+
if (limit > source.length) revert MalformedBlocks();
|
|
58
|
+
while (i < limit) {
|
|
59
|
+
ref = from(source, i);
|
|
60
|
+
if (ref.end > limit) revert MalformedBlocks();
|
|
61
|
+
if (ref.key == key) return ref;
|
|
62
|
+
i = ref.end;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return BlockRef(bytes4(0), limit, limit, limit);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function findChild(
|
|
69
|
+
BlockRef memory parent,
|
|
70
|
+
bytes calldata source,
|
|
71
|
+
bytes4 key
|
|
72
|
+
) internal pure returns (BlockRef memory ref) {
|
|
73
|
+
return find(source, parent.bound, parent.end, key);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function create32(bytes4 key, bytes32 value) internal pure returns (bytes memory) {
|
|
77
|
+
return bytes.concat(key, bytes4(uint32(0x20)), bytes4(uint32(0x20)), value);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function create64(bytes4 key, bytes32 a, bytes32 b) internal pure returns (bytes memory) {
|
|
81
|
+
return bytes.concat(key, bytes4(uint32(0x40)), bytes4(uint32(0x40)), a, b);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function create96(bytes4 key, bytes32 a, bytes32 b, bytes32 c) internal pure returns (bytes memory) {
|
|
85
|
+
return bytes.concat(key, bytes4(uint32(0x60)), bytes4(uint32(0x60)), a, b, c);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function create128(bytes4 key, bytes32 a, bytes32 b, bytes32 c, bytes32 d) internal pure returns (bytes memory) {
|
|
89
|
+
return bytes.concat(key, bytes4(uint32(0x80)), bytes4(uint32(0x80)), a, b, c, d);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function toBountyBlock(uint bounty, bytes32 relayer) internal pure returns (bytes memory) {
|
|
93
|
+
return create64(BOUNTY_KEY, bytes32(bounty), relayer);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function toBalanceBlock(bytes32 asset, bytes32 meta, uint amount) internal pure returns (bytes memory) {
|
|
97
|
+
return create96(BALANCE_KEY, asset, meta, bytes32(amount));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function toCustodyBlock(uint host, bytes32 asset, bytes32 meta, uint amount) internal pure returns (bytes memory) {
|
|
101
|
+
return create128(CUSTODY_KEY, bytes32(host), asset, meta, bytes32(amount));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function isBalance(BlockRef memory ref) internal pure returns (bool) {
|
|
105
|
+
return ref.key == BALANCE_KEY;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function isCustody(BlockRef memory ref) internal pure returns (bool) {
|
|
109
|
+
return ref.key == CUSTODY_KEY;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function resolveRecipient(
|
|
113
|
+
bytes calldata source,
|
|
114
|
+
uint i,
|
|
115
|
+
uint limit,
|
|
116
|
+
bytes32 backup
|
|
117
|
+
) internal pure returns (bytes32) {
|
|
118
|
+
BlockRef memory ref = find(source, i, limit, RECIPIENT_KEY);
|
|
119
|
+
bytes32 to = ref.key != 0 ? ref.unpackRecipient(source) : backup;
|
|
120
|
+
if (to == 0) revert ZeroRecipient();
|
|
121
|
+
return to;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function resolveNode(bytes calldata source, uint i, uint limit, uint backup) internal pure returns (uint) {
|
|
125
|
+
BlockRef memory ref = find(source, i, limit, NODE_KEY);
|
|
126
|
+
uint node = ref.key != 0 ? ref.unpackNode(source) : backup;
|
|
127
|
+
if (node == 0) revert ZeroNode();
|
|
128
|
+
return node;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function ensure(BlockRef memory ref, bytes4 key) internal pure {
|
|
132
|
+
if (key == 0 || key != ref.key) revert InvalidBlock();
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function ensure(BlockRef memory ref, bytes4 key, uint len) internal pure {
|
|
136
|
+
if (key == 0 || key != ref.key || len != (ref.bound - ref.i)) revert InvalidBlock();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function ensure(BlockRef memory ref, bytes4 key, uint min, uint max) internal pure {
|
|
140
|
+
uint len = ref.bound - ref.i;
|
|
141
|
+
if (key == 0 || key != ref.key || len < min || (max != 0 && len > max)) revert InvalidBlock();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function ensure(BlockPairRef memory ref, bytes4 key, uint len) internal pure {
|
|
145
|
+
ensure(ref.a, key, len);
|
|
146
|
+
ensure(ref.b, key, len);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function ensure(BlockPairRef memory ref, bytes4 key, uint min, uint max) internal pure {
|
|
150
|
+
ensure(ref.a, key, min, max);
|
|
151
|
+
ensure(ref.b, key, min, max);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function verifyAuth(
|
|
155
|
+
BlockRef memory ref,
|
|
156
|
+
bytes calldata source,
|
|
157
|
+
uint expectedCid
|
|
158
|
+
) internal pure returns (bytes32 hash, uint deadline, bytes calldata proof, uint next) {
|
|
159
|
+
if (ref.end - ref.bound < AUTH_TOTAL_LEN) revert MalformedBlocks();
|
|
160
|
+
uint cid;
|
|
161
|
+
(cid, deadline, proof) = ref.innerAuthAt(source, ref.end - AUTH_TOTAL_LEN);
|
|
162
|
+
if (cid != expectedCid) revert MalformedBlocks();
|
|
163
|
+
hash = keccak256(source[ref.i - 12:ref.end - AUTH_PROOF_LEN]);
|
|
164
|
+
next = ref.end;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function rebaseToDataRef(BlockRef memory ref, bytes calldata source) internal pure returns (DataRef memory out) {
|
|
168
|
+
uint base;
|
|
169
|
+
assembly ("memory-safe") {
|
|
170
|
+
base := source.offset
|
|
171
|
+
}
|
|
172
|
+
out.key = ref.key;
|
|
173
|
+
out.i = base + ref.i;
|
|
174
|
+
out.bound = base + ref.bound;
|
|
175
|
+
out.end = base + ref.end;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ── *From ─────────────────────────────────────────────────────────────────
|
|
179
|
+
|
|
180
|
+
function routeFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
181
|
+
ref = from(source, i);
|
|
182
|
+
ensure(ref, ROUTE_KEY);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function nodeFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
186
|
+
ref = from(source, i);
|
|
187
|
+
ensure(ref, NODE_KEY, 32);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function recipientFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
191
|
+
ref = from(source, i);
|
|
192
|
+
ensure(ref, RECIPIENT_KEY, 32);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function partyFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
196
|
+
ref = from(source, i);
|
|
197
|
+
ensure(ref, PARTY_KEY, 32);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function rateFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
201
|
+
ref = from(source, i);
|
|
202
|
+
ensure(ref, RATE_KEY, 32);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function quantityFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
206
|
+
ref = from(source, i);
|
|
207
|
+
ensure(ref, QUANTITY_KEY, 32);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function assetFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
211
|
+
ref = from(source, i);
|
|
212
|
+
ensure(ref, ASSET_KEY, 64);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function fundingFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
216
|
+
ref = from(source, i);
|
|
217
|
+
ensure(ref, FUNDING_KEY, 64);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function bountyFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
221
|
+
ref = from(source, i);
|
|
222
|
+
ensure(ref, BOUNTY_KEY, 64);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function amountFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
226
|
+
ref = from(source, i);
|
|
227
|
+
ensure(ref, AMOUNT_KEY, 96);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function amountTwoFrom(bytes calldata source, uint i) internal pure returns (BlockPairRef memory ref) {
|
|
231
|
+
ref = twoFrom(source, i);
|
|
232
|
+
ensure(ref, AMOUNT_KEY, 96);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function balanceFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
236
|
+
ref = from(source, i);
|
|
237
|
+
ensure(ref, BALANCE_KEY, 96);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function balanceTwoFrom(bytes calldata source, uint i) internal pure returns (BlockPairRef memory ref) {
|
|
241
|
+
ref = twoFrom(source, i);
|
|
242
|
+
ensure(ref, BALANCE_KEY, 96);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function minimumFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
246
|
+
ref = from(source, i);
|
|
247
|
+
ensure(ref, MINIMUM_KEY, 96);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function maximumFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
251
|
+
ref = from(source, i);
|
|
252
|
+
ensure(ref, MAXIMUM_KEY, 96);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function listingFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
256
|
+
ref = from(source, i);
|
|
257
|
+
ensure(ref, LISTING_KEY, 96);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function stepFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
261
|
+
ref = from(source, i);
|
|
262
|
+
ensure(ref, STEP_KEY, 64, 0);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function authFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
266
|
+
ref = from(source, i);
|
|
267
|
+
ensure(ref, AUTH_KEY, 149);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function custodyFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
271
|
+
ref = from(source, i);
|
|
272
|
+
ensure(ref, CUSTODY_KEY, 128);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function custodyTwoFrom(bytes calldata source, uint i) internal pure returns (BlockPairRef memory ref) {
|
|
276
|
+
ref = twoFrom(source, i);
|
|
277
|
+
ensure(ref, CUSTODY_KEY, 128);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function allocationFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
281
|
+
ref = from(source, i);
|
|
282
|
+
ensure(ref, ALLOCATION_KEY, 128);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function txFrom(bytes calldata source, uint i) internal pure returns (BlockRef memory ref) {
|
|
286
|
+
ref = from(source, i);
|
|
287
|
+
ensure(ref, TX_KEY, 160);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// ── inner* ────────────────────────────────────────────────────────────────
|
|
291
|
+
|
|
292
|
+
function innerPair(BlockRef memory parent, bytes calldata source) internal pure returns (BlockPairRef memory ref) {
|
|
293
|
+
ref.a = childAt(parent, source, parent.bound);
|
|
294
|
+
ref.b = childAt(parent, source, ref.a.end);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function innerRoute(BlockRef memory parent, bytes calldata source) internal pure returns (bytes calldata data) {
|
|
298
|
+
return unpackRoute(childAt(parent, source, parent.bound), source);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function innerNode(BlockRef memory parent, bytes calldata source) internal pure returns (uint id) {
|
|
302
|
+
return unpackNode(childAt(parent, source, parent.bound), source);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function innerRecipient(BlockRef memory parent, bytes calldata source) internal pure returns (bytes32 account) {
|
|
306
|
+
return unpackRecipient(childAt(parent, source, parent.bound), source);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function innerParty(BlockRef memory parent, bytes calldata source) internal pure returns (bytes32 account) {
|
|
310
|
+
return unpackParty(childAt(parent, source, parent.bound), source);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function innerRate(BlockRef memory parent, bytes calldata source) internal pure returns (uint value) {
|
|
314
|
+
return unpackRate(childAt(parent, source, parent.bound), source);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function innerQuantity(BlockRef memory parent, bytes calldata source) internal pure returns (uint amount) {
|
|
318
|
+
return unpackQuantity(childAt(parent, source, parent.bound), source);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function innerAsset(
|
|
322
|
+
BlockRef memory parent,
|
|
323
|
+
bytes calldata source
|
|
324
|
+
) internal pure returns (bytes32 asset, bytes32 meta) {
|
|
325
|
+
return unpackAsset(childAt(parent, source, parent.bound), source);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
function innerFunding(
|
|
329
|
+
BlockRef memory parent,
|
|
330
|
+
bytes calldata source
|
|
331
|
+
) internal pure returns (uint host, uint amount) {
|
|
332
|
+
return unpackFunding(childAt(parent, source, parent.bound), source);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function innerBounty(
|
|
336
|
+
BlockRef memory parent,
|
|
337
|
+
bytes calldata source
|
|
338
|
+
) internal pure returns (uint amount, bytes32 relayer) {
|
|
339
|
+
return unpackBounty(childAt(parent, source, parent.bound), source);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function innerAmount(
|
|
343
|
+
BlockRef memory parent,
|
|
344
|
+
bytes calldata source
|
|
345
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
346
|
+
return unpackAmount(childAt(parent, source, parent.bound), source);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function innerBalance(
|
|
350
|
+
BlockRef memory parent,
|
|
351
|
+
bytes calldata source
|
|
352
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
353
|
+
return unpackBalance(childAt(parent, source, parent.bound), source);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function innerMinimum(
|
|
357
|
+
BlockRef memory parent,
|
|
358
|
+
bytes calldata source
|
|
359
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
360
|
+
return unpackMinimum(childAt(parent, source, parent.bound), source);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function innerMaximum(
|
|
364
|
+
BlockRef memory parent,
|
|
365
|
+
bytes calldata source
|
|
366
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
367
|
+
return unpackMaximum(childAt(parent, source, parent.bound), source);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
function innerListing(
|
|
371
|
+
BlockRef memory parent,
|
|
372
|
+
bytes calldata source
|
|
373
|
+
) internal pure returns (uint host, bytes32 asset, bytes32 meta) {
|
|
374
|
+
return unpackListing(childAt(parent, source, parent.bound), source);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function innerStep(
|
|
378
|
+
BlockRef memory parent,
|
|
379
|
+
bytes calldata source
|
|
380
|
+
) internal pure returns (uint target, uint value, bytes calldata req) {
|
|
381
|
+
return unpackStep(childAt(parent, source, parent.bound), source);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
function innerAuth(
|
|
385
|
+
BlockRef memory parent,
|
|
386
|
+
bytes calldata source
|
|
387
|
+
) internal pure returns (uint cid, uint deadline, bytes calldata proof) {
|
|
388
|
+
return unpackAuth(childAt(parent, source, parent.bound), source);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
function innerCustody(
|
|
392
|
+
BlockRef memory parent,
|
|
393
|
+
bytes calldata source
|
|
394
|
+
) internal pure returns (HostAmount memory value) {
|
|
395
|
+
return toCustodyValue(childAt(parent, source, parent.bound), source);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function innerAllocation(
|
|
399
|
+
BlockRef memory parent,
|
|
400
|
+
bytes calldata source
|
|
401
|
+
) internal pure returns (HostAmount memory value) {
|
|
402
|
+
return toAllocationValue(childAt(parent, source, parent.bound), source);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function innerTx(BlockRef memory parent, bytes calldata source) internal pure returns (Tx memory value) {
|
|
406
|
+
return toTxValue(childAt(parent, source, parent.bound), source);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// ── inner*At ──────────────────────────────────────────────────────────────
|
|
410
|
+
|
|
411
|
+
function innerPairAt(
|
|
412
|
+
BlockRef memory parent,
|
|
413
|
+
bytes calldata source,
|
|
414
|
+
uint i
|
|
415
|
+
) internal pure returns (BlockPairRef memory ref) {
|
|
416
|
+
ref.a = childAt(parent, source, i);
|
|
417
|
+
ref.b = childAt(parent, source, ref.a.end);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
function innerRouteAt(
|
|
421
|
+
BlockRef memory parent,
|
|
422
|
+
bytes calldata source,
|
|
423
|
+
uint i
|
|
424
|
+
) internal pure returns (bytes calldata data) {
|
|
425
|
+
return unpackRoute(childAt(parent, source, i), source);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
function innerNodeAt(BlockRef memory parent, bytes calldata source, uint i) internal pure returns (uint id) {
|
|
429
|
+
return unpackNode(childAt(parent, source, i), source);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
function innerRecipientAt(
|
|
433
|
+
BlockRef memory parent,
|
|
434
|
+
bytes calldata source,
|
|
435
|
+
uint i
|
|
436
|
+
) internal pure returns (bytes32 account) {
|
|
437
|
+
return unpackRecipient(childAt(parent, source, i), source);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
function innerPartyAt(
|
|
441
|
+
BlockRef memory parent,
|
|
442
|
+
bytes calldata source,
|
|
443
|
+
uint i
|
|
444
|
+
) internal pure returns (bytes32 account) {
|
|
445
|
+
return unpackParty(childAt(parent, source, i), source);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
function innerRateAt(BlockRef memory parent, bytes calldata source, uint i) internal pure returns (uint value) {
|
|
449
|
+
return unpackRate(childAt(parent, source, i), source);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
function innerQuantityAt(BlockRef memory parent, bytes calldata source, uint i) internal pure returns (uint amount) {
|
|
453
|
+
return unpackQuantity(childAt(parent, source, i), source);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
function innerAssetAt(
|
|
457
|
+
BlockRef memory parent,
|
|
458
|
+
bytes calldata source,
|
|
459
|
+
uint i
|
|
460
|
+
) internal pure returns (bytes32 asset, bytes32 meta) {
|
|
461
|
+
return unpackAsset(childAt(parent, source, i), source);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
function innerFundingAt(
|
|
465
|
+
BlockRef memory parent,
|
|
466
|
+
bytes calldata source,
|
|
467
|
+
uint i
|
|
468
|
+
) internal pure returns (uint host, uint amount) {
|
|
469
|
+
return unpackFunding(childAt(parent, source, i), source);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
function innerBountyAt(
|
|
473
|
+
BlockRef memory parent,
|
|
474
|
+
bytes calldata source,
|
|
475
|
+
uint i
|
|
476
|
+
) internal pure returns (uint amount, bytes32 relayer) {
|
|
477
|
+
return unpackBounty(childAt(parent, source, i), source);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
function innerAmountAt(
|
|
481
|
+
BlockRef memory parent,
|
|
482
|
+
bytes calldata source,
|
|
483
|
+
uint i
|
|
484
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
485
|
+
return unpackAmount(childAt(parent, source, i), source);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
function innerBalanceAt(
|
|
489
|
+
BlockRef memory parent,
|
|
490
|
+
bytes calldata source,
|
|
491
|
+
uint i
|
|
492
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
493
|
+
return unpackBalance(childAt(parent, source, i), source);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
function innerMinimumAt(
|
|
497
|
+
BlockRef memory parent,
|
|
498
|
+
bytes calldata source,
|
|
499
|
+
uint i
|
|
500
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
501
|
+
return unpackMinimum(childAt(parent, source, i), source);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
function innerMaximumAt(
|
|
505
|
+
BlockRef memory parent,
|
|
506
|
+
bytes calldata source,
|
|
507
|
+
uint i
|
|
508
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
509
|
+
return unpackMaximum(childAt(parent, source, i), source);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
function innerListingAt(
|
|
513
|
+
BlockRef memory parent,
|
|
514
|
+
bytes calldata source,
|
|
515
|
+
uint i
|
|
516
|
+
) internal pure returns (uint host, bytes32 asset, bytes32 meta) {
|
|
517
|
+
return unpackListing(childAt(parent, source, i), source);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
function innerStepAt(
|
|
521
|
+
BlockRef memory parent,
|
|
522
|
+
bytes calldata source,
|
|
523
|
+
uint i
|
|
524
|
+
) internal pure returns (uint target, uint value, bytes calldata req) {
|
|
525
|
+
return unpackStep(childAt(parent, source, i), source);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
function innerAuthAt(
|
|
529
|
+
BlockRef memory parent,
|
|
530
|
+
bytes calldata source,
|
|
531
|
+
uint i
|
|
532
|
+
) internal pure returns (uint cid, uint deadline, bytes calldata proof) {
|
|
533
|
+
return unpackAuth(childAt(parent, source, i), source);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
function innerCustodyAt(
|
|
537
|
+
BlockRef memory parent,
|
|
538
|
+
bytes calldata source,
|
|
539
|
+
uint i
|
|
540
|
+
) internal pure returns (HostAmount memory value) {
|
|
541
|
+
return toCustodyValue(childAt(parent, source, i), source);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
function innerAllocationAt(
|
|
545
|
+
BlockRef memory parent,
|
|
546
|
+
bytes calldata source,
|
|
547
|
+
uint i
|
|
548
|
+
) internal pure returns (HostAmount memory value) {
|
|
549
|
+
return toAllocationValue(childAt(parent, source, i), source);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
function innerTxAt(BlockRef memory parent, bytes calldata source, uint i) internal pure returns (Tx memory value) {
|
|
553
|
+
return toTxValue(childAt(parent, source, i), source);
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
// ── unpack*At ──────────────────────────────────────────────────────────────
|
|
557
|
+
|
|
558
|
+
function unpackNodeAt(bytes calldata source, uint i) internal pure returns (uint id) {
|
|
559
|
+
return unpackNode(from(source, i), source);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
function unpackRecipientAt(bytes calldata source, uint i) internal pure returns (bytes32 account) {
|
|
563
|
+
return unpackRecipient(from(source, i), source);
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
function unpackPartyAt(bytes calldata source, uint i) internal pure returns (bytes32 account) {
|
|
567
|
+
return unpackParty(from(source, i), source);
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
function unpackRateAt(bytes calldata source, uint i) internal pure returns (uint value) {
|
|
571
|
+
return unpackRate(from(source, i), source);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
function unpackQuantityAt(bytes calldata source, uint i) internal pure returns (uint amount) {
|
|
575
|
+
return unpackQuantity(from(source, i), source);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
function unpackAssetAt(bytes calldata source, uint i) internal pure returns (bytes32 asset, bytes32 meta) {
|
|
579
|
+
return unpackAsset(from(source, i), source);
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
function unpackFundingAt(bytes calldata source, uint i) internal pure returns (uint host, uint amount) {
|
|
583
|
+
return unpackFunding(from(source, i), source);
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
function unpackBountyAt(bytes calldata source, uint i) internal pure returns (uint amount, bytes32 relayer) {
|
|
587
|
+
return unpackBounty(from(source, i), source);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
function unpackAmountAt(
|
|
591
|
+
bytes calldata source,
|
|
592
|
+
uint i
|
|
593
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
594
|
+
return unpackAmount(from(source, i), source);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
function unpackBalanceAt(
|
|
598
|
+
bytes calldata source,
|
|
599
|
+
uint i
|
|
600
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
601
|
+
return unpackBalance(from(source, i), source);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
function unpackMinimumAt(
|
|
605
|
+
bytes calldata source,
|
|
606
|
+
uint i
|
|
607
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
608
|
+
return unpackMinimum(from(source, i), source);
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
function unpackMaximumAt(
|
|
612
|
+
bytes calldata source,
|
|
613
|
+
uint i
|
|
614
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
615
|
+
return unpackMaximum(from(source, i), source);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
function unpackListingAt(
|
|
619
|
+
bytes calldata source,
|
|
620
|
+
uint i
|
|
621
|
+
) internal pure returns (uint host, bytes32 asset, bytes32 meta) {
|
|
622
|
+
return unpackListing(from(source, i), source);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
function unpackCustodyAt(bytes calldata source, uint i) internal pure returns (HostAmount memory value) {
|
|
626
|
+
return toCustodyValue(from(source, i), source);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
function unpackAllocationAt(bytes calldata source, uint i) internal pure returns (HostAmount memory value) {
|
|
630
|
+
return toAllocationValue(from(source, i), source);
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
function unpackTxAt(bytes calldata source, uint i) internal pure returns (Tx memory value) {
|
|
634
|
+
return toTxValue(from(source, i), source);
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
// ── unpack* ───────────────────────────────────────────────────────────────
|
|
638
|
+
|
|
639
|
+
function unpackRoute(BlockRef memory ref, bytes calldata source) internal pure returns (bytes calldata data) {
|
|
640
|
+
ensure(ref, ROUTE_KEY);
|
|
641
|
+
return source[ref.i:ref.bound];
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
function unpackRouteUint(BlockRef memory ref, bytes calldata source) internal pure returns (uint) {
|
|
645
|
+
ensure(ref, ROUTE_KEY, 32);
|
|
646
|
+
return uint(bytes32(source[ref.i:ref.i + 32]));
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
function unpackRoute2Uint(BlockRef memory ref, bytes calldata source) internal pure returns (uint a, uint b) {
|
|
650
|
+
ensure(ref, ROUTE_KEY, 64);
|
|
651
|
+
a = uint(bytes32(source[ref.i:ref.i + 32]));
|
|
652
|
+
b = uint(bytes32(source[ref.i + 32:ref.i + 64]));
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
function unpackRoute3Uint(BlockRef memory ref, bytes calldata source) internal pure returns (uint a, uint b, uint c) {
|
|
656
|
+
ensure(ref, ROUTE_KEY, 96);
|
|
657
|
+
a = uint(bytes32(source[ref.i:ref.i + 32]));
|
|
658
|
+
b = uint(bytes32(source[ref.i + 32:ref.i + 64]));
|
|
659
|
+
c = uint(bytes32(source[ref.i + 64:ref.i + 96]));
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
function unpackRoute32(BlockRef memory ref, bytes calldata source) internal pure returns (bytes32) {
|
|
663
|
+
ensure(ref, ROUTE_KEY, 32);
|
|
664
|
+
return bytes32(source[ref.i:ref.i + 32]);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
function unpackRoute64(BlockRef memory ref, bytes calldata source) internal pure returns (bytes32 a, bytes32 b) {
|
|
668
|
+
ensure(ref, ROUTE_KEY, 64);
|
|
669
|
+
a = bytes32(source[ref.i:ref.i + 32]);
|
|
670
|
+
b = bytes32(source[ref.i + 32:ref.i + 64]);
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
function unpackRoute96(
|
|
674
|
+
BlockRef memory ref,
|
|
675
|
+
bytes calldata source
|
|
676
|
+
) internal pure returns (bytes32 a, bytes32 b, bytes32 c) {
|
|
677
|
+
ensure(ref, ROUTE_KEY, 96);
|
|
678
|
+
a = bytes32(source[ref.i:ref.i + 32]);
|
|
679
|
+
b = bytes32(source[ref.i + 32:ref.i + 64]);
|
|
680
|
+
c = bytes32(source[ref.i + 64:ref.i + 96]);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
function unpackNode(BlockRef memory ref, bytes calldata source) internal pure returns (uint id) {
|
|
684
|
+
ensure(ref, NODE_KEY, 32);
|
|
685
|
+
return uint(bytes32(source[ref.i:ref.i + 32]));
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
function unpackRecipient(BlockRef memory ref, bytes calldata source) internal pure returns (bytes32 account) {
|
|
689
|
+
ensure(ref, RECIPIENT_KEY, 32);
|
|
690
|
+
return bytes32(source[ref.i:ref.i + 32]);
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
function unpackParty(BlockRef memory ref, bytes calldata source) internal pure returns (bytes32 account) {
|
|
694
|
+
ensure(ref, PARTY_KEY, 32);
|
|
695
|
+
return bytes32(source[ref.i:ref.i + 32]);
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
function unpackRate(BlockRef memory ref, bytes calldata source) internal pure returns (uint value) {
|
|
699
|
+
ensure(ref, RATE_KEY, 32);
|
|
700
|
+
return uint(bytes32(source[ref.i:ref.i + 32]));
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
function unpackQuantity(BlockRef memory ref, bytes calldata source) internal pure returns (uint amount) {
|
|
704
|
+
ensure(ref, QUANTITY_KEY, 32);
|
|
705
|
+
return uint(bytes32(source[ref.i:ref.i + 32]));
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
function unpackAsset(
|
|
709
|
+
BlockRef memory ref,
|
|
710
|
+
bytes calldata source
|
|
711
|
+
) internal pure returns (bytes32 asset, bytes32 meta) {
|
|
712
|
+
ensure(ref, ASSET_KEY, 64);
|
|
713
|
+
return (bytes32(source[ref.i:ref.i + 32]), bytes32(source[ref.i + 32:ref.i + 64]));
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
function unpackFunding(BlockRef memory ref, bytes calldata source) internal pure returns (uint host, uint amount) {
|
|
717
|
+
ensure(ref, FUNDING_KEY, 64);
|
|
718
|
+
host = uint(bytes32(source[ref.i:ref.i + 32]));
|
|
719
|
+
amount = uint(bytes32(source[ref.i + 32:ref.i + 64]));
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
function unpackBounty(
|
|
723
|
+
BlockRef memory ref,
|
|
724
|
+
bytes calldata source
|
|
725
|
+
) internal pure returns (uint amount, bytes32 relayer) {
|
|
726
|
+
ensure(ref, BOUNTY_KEY, 64);
|
|
727
|
+
amount = uint(bytes32(source[ref.i:ref.i + 32]));
|
|
728
|
+
relayer = bytes32(source[ref.i + 32:ref.i + 64]);
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
function unpackAmount(
|
|
732
|
+
BlockRef memory ref,
|
|
733
|
+
bytes calldata source
|
|
734
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
735
|
+
ensure(ref, AMOUNT_KEY, 96);
|
|
736
|
+
return unpackAssetAmount(ref, source);
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
function unpackBalance(
|
|
740
|
+
BlockRef memory ref,
|
|
741
|
+
bytes calldata source
|
|
742
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
743
|
+
ensure(ref, BALANCE_KEY, 96);
|
|
744
|
+
return unpackAssetAmount(ref, source);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
function unpackMinimum(
|
|
748
|
+
BlockRef memory ref,
|
|
749
|
+
bytes calldata source
|
|
750
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
751
|
+
ensure(ref, MINIMUM_KEY, 96);
|
|
752
|
+
return unpackAssetAmount(ref, source);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
function unpackMaximum(
|
|
756
|
+
BlockRef memory ref,
|
|
757
|
+
bytes calldata source
|
|
758
|
+
) internal pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
759
|
+
ensure(ref, MAXIMUM_KEY, 96);
|
|
760
|
+
return unpackAssetAmount(ref, source);
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
function unpackListing(
|
|
764
|
+
BlockRef memory ref,
|
|
765
|
+
bytes calldata source
|
|
766
|
+
) internal pure returns (uint host, bytes32 asset, bytes32 meta) {
|
|
767
|
+
ensure(ref, LISTING_KEY, 96);
|
|
768
|
+
host = uint(bytes32(source[ref.i:ref.i + 32]));
|
|
769
|
+
asset = bytes32(source[ref.i + 32:ref.i + 64]);
|
|
770
|
+
meta = bytes32(source[ref.i + 64:ref.i + 96]);
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
function unpackStep(
|
|
774
|
+
BlockRef memory ref,
|
|
775
|
+
bytes calldata source
|
|
776
|
+
) internal pure returns (uint target, uint value, bytes calldata req) {
|
|
777
|
+
ensure(ref, STEP_KEY, 64, 0);
|
|
778
|
+
target = uint(bytes32(source[ref.i:ref.i + 32]));
|
|
779
|
+
value = uint(bytes32(source[ref.i + 32:ref.i + 64]));
|
|
780
|
+
req = source[ref.i + 64:ref.bound];
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
function unpackAuth(
|
|
784
|
+
BlockRef memory ref,
|
|
785
|
+
bytes calldata source
|
|
786
|
+
) internal pure returns (uint cid, uint deadline, bytes calldata proof) {
|
|
787
|
+
ensure(ref, AUTH_KEY, 149);
|
|
788
|
+
cid = uint(bytes32(source[ref.i:ref.i + 32]));
|
|
789
|
+
deadline = uint(bytes32(source[ref.i + 32:ref.i + 64]));
|
|
790
|
+
proof = source[ref.i + 64:ref.bound];
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
// ── expect* ───────────────────────────────────────────────────────────────
|
|
794
|
+
|
|
795
|
+
function expectAmount(BlockRef memory ref, bytes calldata source, bytes32 asset, bytes32 meta) internal pure returns (uint amount) {
|
|
796
|
+
ensure(ref, AMOUNT_KEY, 96);
|
|
797
|
+
if (bytes32(source[ref.i:ref.i + 32]) != asset) revert UnexpectedAsset();
|
|
798
|
+
if (bytes32(source[ref.i + 32:ref.i + 64]) != meta) revert UnexpectedMeta();
|
|
799
|
+
return uint(bytes32(source[ref.i + 64:ref.i + 96]));
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
function expectBalance(
|
|
803
|
+
BlockRef memory ref,
|
|
804
|
+
bytes calldata source,
|
|
805
|
+
bytes32 asset,
|
|
806
|
+
bytes32 meta
|
|
807
|
+
) internal pure returns (uint amount) {
|
|
808
|
+
ensure(ref, BALANCE_KEY, 96);
|
|
809
|
+
if (bytes32(source[ref.i:ref.i + 32]) != asset) revert UnexpectedAsset();
|
|
810
|
+
if (bytes32(source[ref.i + 32:ref.i + 64]) != meta) revert UnexpectedMeta();
|
|
811
|
+
return uint(bytes32(source[ref.i + 64:ref.i + 96]));
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
function expectMinimum(
|
|
815
|
+
BlockRef memory ref,
|
|
816
|
+
bytes calldata source,
|
|
817
|
+
bytes32 asset,
|
|
818
|
+
bytes32 meta
|
|
819
|
+
) internal pure returns (uint amount) {
|
|
820
|
+
ensure(ref, MINIMUM_KEY, 96);
|
|
821
|
+
if (bytes32(source[ref.i:ref.i + 32]) != asset) revert UnexpectedAsset();
|
|
822
|
+
if (bytes32(source[ref.i + 32:ref.i + 64]) != meta) revert UnexpectedMeta();
|
|
823
|
+
return uint(bytes32(source[ref.i + 64:ref.i + 96]));
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
function expectMaximum(
|
|
827
|
+
BlockRef memory ref,
|
|
828
|
+
bytes calldata source,
|
|
829
|
+
bytes32 asset,
|
|
830
|
+
bytes32 meta
|
|
831
|
+
) internal pure returns (uint amount) {
|
|
832
|
+
ensure(ref, MAXIMUM_KEY, 96);
|
|
833
|
+
if (bytes32(source[ref.i:ref.i + 32]) != asset) revert UnexpectedAsset();
|
|
834
|
+
if (bytes32(source[ref.i + 32:ref.i + 64]) != meta) revert UnexpectedMeta();
|
|
835
|
+
return uint(bytes32(source[ref.i + 64:ref.i + 96]));
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
function expectCustody(BlockRef memory ref, bytes calldata source, uint host) internal pure returns (AssetAmount memory value) {
|
|
839
|
+
ensure(ref, CUSTODY_KEY, 128);
|
|
840
|
+
if (uint(bytes32(source[ref.i:ref.i + 32])) != host) revert UnexpectedHost();
|
|
841
|
+
value.asset = bytes32(source[ref.i + 32:ref.i + 64]);
|
|
842
|
+
value.meta = bytes32(source[ref.i + 64:ref.i + 96]);
|
|
843
|
+
value.amount = uint(bytes32(source[ref.i + 96:ref.i + 128]));
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
// ── to*Value ──────────────────────────────────────────────────────────────
|
|
847
|
+
|
|
848
|
+
function toAmountValue(
|
|
849
|
+
BlockRef memory ref,
|
|
850
|
+
bytes calldata source
|
|
851
|
+
) internal pure returns (AssetAmount memory value) {
|
|
852
|
+
ensure(ref, AMOUNT_KEY, 96);
|
|
853
|
+
return toAssetAmount(ref, source);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
function toBalanceValue(
|
|
857
|
+
BlockRef memory ref,
|
|
858
|
+
bytes calldata source
|
|
859
|
+
) internal pure returns (AssetAmount memory value) {
|
|
860
|
+
ensure(ref, BALANCE_KEY, 96);
|
|
861
|
+
return toAssetAmount(ref, source);
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
function toMinimumValue(
|
|
865
|
+
BlockRef memory ref,
|
|
866
|
+
bytes calldata source
|
|
867
|
+
) internal pure returns (AssetAmount memory value) {
|
|
868
|
+
ensure(ref, MINIMUM_KEY, 96);
|
|
869
|
+
return toAssetAmount(ref, source);
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
function toMaximumValue(
|
|
873
|
+
BlockRef memory ref,
|
|
874
|
+
bytes calldata source
|
|
875
|
+
) internal pure returns (AssetAmount memory value) {
|
|
876
|
+
ensure(ref, MAXIMUM_KEY, 96);
|
|
877
|
+
return toAssetAmount(ref, source);
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
function toListingValue(BlockRef memory ref, bytes calldata source) internal pure returns (Listing memory value) {
|
|
881
|
+
ensure(ref, LISTING_KEY, 96);
|
|
882
|
+
value.host = uint(bytes32(source[ref.i:ref.i + 32]));
|
|
883
|
+
value.asset = bytes32(source[ref.i + 32:ref.i + 64]);
|
|
884
|
+
value.meta = bytes32(source[ref.i + 64:ref.i + 96]);
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
function toCustodyValue(
|
|
888
|
+
BlockRef memory ref,
|
|
889
|
+
bytes calldata source
|
|
890
|
+
) internal pure returns (HostAmount memory value) {
|
|
891
|
+
ensure(ref, CUSTODY_KEY, 128);
|
|
892
|
+
return toHostAmountValue(ref, source);
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
function toAllocationValue(
|
|
896
|
+
BlockRef memory ref,
|
|
897
|
+
bytes calldata source
|
|
898
|
+
) internal pure returns (HostAmount memory value) {
|
|
899
|
+
ensure(ref, ALLOCATION_KEY, 128);
|
|
900
|
+
return toHostAmountValue(ref, source);
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
function toTxValue(BlockRef memory ref, bytes calldata source) internal pure returns (Tx memory value) {
|
|
904
|
+
ensure(ref, TX_KEY, 160);
|
|
905
|
+
value.from = bytes32(source[ref.i:ref.i + 32]);
|
|
906
|
+
value.to = bytes32(source[ref.i + 32:ref.i + 64]);
|
|
907
|
+
value.asset = bytes32(source[ref.i + 64:ref.i + 96]);
|
|
908
|
+
value.meta = bytes32(source[ref.i + 96:ref.i + 128]);
|
|
909
|
+
value.amount = uint(bytes32(source[ref.i + 128:ref.i + 160]));
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
// ── private helpers ───────────────────────────────────────────────────────
|
|
913
|
+
|
|
914
|
+
function unpackAssetAmount(
|
|
915
|
+
BlockRef memory ref,
|
|
916
|
+
bytes calldata source
|
|
917
|
+
) private pure returns (bytes32 asset, bytes32 meta, uint amount) {
|
|
918
|
+
asset = bytes32(source[ref.i:ref.i + 32]);
|
|
919
|
+
meta = bytes32(source[ref.i + 32:ref.i + 64]);
|
|
920
|
+
amount = uint(bytes32(source[ref.i + 64:ref.i + 96]));
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
function toAssetAmount(BlockRef memory ref, bytes calldata source) private pure returns (AssetAmount memory value) {
|
|
924
|
+
value.asset = bytes32(source[ref.i:ref.i + 32]);
|
|
925
|
+
value.meta = bytes32(source[ref.i + 32:ref.i + 64]);
|
|
926
|
+
value.amount = uint(bytes32(source[ref.i + 64:ref.i + 96]));
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
function toHostAmountValue(
|
|
930
|
+
BlockRef memory ref,
|
|
931
|
+
bytes calldata source
|
|
932
|
+
) private pure returns (HostAmount memory value) {
|
|
933
|
+
value.host = uint(bytes32(source[ref.i:ref.i + 32]));
|
|
934
|
+
value.asset = bytes32(source[ref.i + 32:ref.i + 64]);
|
|
935
|
+
value.meta = bytes32(source[ref.i + 64:ref.i + 96]);
|
|
936
|
+
value.amount = uint(bytes32(source[ref.i + 96:ref.i + 128]));
|
|
937
|
+
}
|
|
938
|
+
}
|