@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.
Files changed (105) hide show
  1. package/LICENSE +648 -0
  2. package/README.md +134 -0
  3. package/contracts/Blocks.sol +73 -0
  4. package/contracts/Commands.sol +47 -0
  5. package/contracts/Core.sol +10 -0
  6. package/contracts/Events.sol +18 -0
  7. package/contracts/Schema.sol +57 -0
  8. package/contracts/Utils.sol +105 -0
  9. package/contracts/blocks/Data.sol +646 -0
  10. package/contracts/blocks/Errors.sol +10 -0
  11. package/contracts/blocks/Mem.sol +122 -0
  12. package/contracts/blocks/Readers.sol +938 -0
  13. package/contracts/blocks/Schema.sol +148 -0
  14. package/contracts/blocks/Writers.sol +187 -0
  15. package/contracts/combinators/AmountToBalance.sol +26 -0
  16. package/contracts/combinators/AmountToCustody.sol +37 -0
  17. package/contracts/combinators/CustodyToBalance.sol +27 -0
  18. package/contracts/combinators/EachRoute.sol +19 -0
  19. package/contracts/combinators/MapBalance.sol +26 -0
  20. package/contracts/combinators/MapCustody.sol +26 -0
  21. package/contracts/combinators/RouteToBalance.sol +27 -0
  22. package/contracts/commands/Base.sol +39 -0
  23. package/contracts/commands/Borrow.sol +86 -0
  24. package/contracts/commands/Burn.sol +32 -0
  25. package/contracts/commands/Create.sol +31 -0
  26. package/contracts/commands/CreditTo.sol +36 -0
  27. package/contracts/commands/DebitFrom.sol +44 -0
  28. package/contracts/commands/Deposit.sol +46 -0
  29. package/contracts/commands/Fund.sol +37 -0
  30. package/contracts/commands/Liquidate.sol +93 -0
  31. package/contracts/commands/Liquidity.sol +171 -0
  32. package/contracts/commands/Mint.sol +41 -0
  33. package/contracts/commands/Pipe.sol +54 -0
  34. package/contracts/commands/Provision.sol +48 -0
  35. package/contracts/commands/Reclaim.sol +46 -0
  36. package/contracts/commands/Redeem.sol +93 -0
  37. package/contracts/commands/Remove.sol +31 -0
  38. package/contracts/commands/Repay.sol +93 -0
  39. package/contracts/commands/Settle.sol +32 -0
  40. package/contracts/commands/Stake.sol +114 -0
  41. package/contracts/commands/Supply.sol +32 -0
  42. package/contracts/commands/Swap.sol +86 -0
  43. package/contracts/commands/Transfer.sol +41 -0
  44. package/contracts/commands/Unstake.sol +49 -0
  45. package/contracts/commands/Withdraw.sol +37 -0
  46. package/contracts/commands/admin/Allocate.sol +33 -0
  47. package/contracts/commands/admin/AllowAssets.sol +34 -0
  48. package/contracts/commands/admin/Authorize.sol +32 -0
  49. package/contracts/commands/admin/DenyAssets.sol +34 -0
  50. package/contracts/commands/admin/Destroy.sol +26 -0
  51. package/contracts/commands/admin/Init.sol +26 -0
  52. package/contracts/commands/admin/Relocate.sol +32 -0
  53. package/contracts/commands/admin/Unauthorize.sol +32 -0
  54. package/contracts/core/Access.sol +49 -0
  55. package/contracts/core/Balances.sol +9 -0
  56. package/contracts/core/Host.sol +25 -0
  57. package/contracts/core/Operation.sol +32 -0
  58. package/contracts/core/Validator.sol +31 -0
  59. package/contracts/events/Access.sol +14 -0
  60. package/contracts/events/Asset.sol +14 -0
  61. package/contracts/events/Balance.sol +14 -0
  62. package/contracts/events/Collateral.sol +15 -0
  63. package/contracts/events/Command.sol +14 -0
  64. package/contracts/events/Debt.sol +15 -0
  65. package/contracts/events/Deposit.sol +14 -0
  66. package/contracts/events/Emitter.sol +7 -0
  67. package/contracts/events/Fastish.sol +14 -0
  68. package/contracts/events/Governed.sol +14 -0
  69. package/contracts/events/HostAnnounced.sol +14 -0
  70. package/contracts/events/Listing.sol +14 -0
  71. package/contracts/events/Peer.sol +14 -0
  72. package/contracts/events/Quote.sol +14 -0
  73. package/contracts/events/Withdraw.sol +14 -0
  74. package/contracts/interfaces/IHostDiscovery.sol +6 -0
  75. package/contracts/peer/AllowAssets.sol +31 -0
  76. package/contracts/peer/Base.sol +19 -0
  77. package/contracts/peer/DenyAssets.sol +31 -0
  78. package/contracts/peer/Pull.sol +30 -0
  79. package/contracts/peer/Push.sol +30 -0
  80. package/contracts/test/TestBlockHelper.sol +256 -0
  81. package/contracts/test/TestBorrowHost.sol +46 -0
  82. package/contracts/test/TestBurnHost.sol +28 -0
  83. package/contracts/test/TestCreateHost.sol +26 -0
  84. package/contracts/test/TestDiscovery.sol +6 -0
  85. package/contracts/test/TestECDSA.sol +16 -0
  86. package/contracts/test/TestHost.sol +215 -0
  87. package/contracts/test/TestLiquidityHost.sol +149 -0
  88. package/contracts/test/TestMintHost.sol +40 -0
  89. package/contracts/test/TestPeerHost.sol +34 -0
  90. package/contracts/test/TestReclaimHost.sol +47 -0
  91. package/contracts/test/TestRejectEther.sol +8 -0
  92. package/contracts/test/TestRemoveHost.sol +26 -0
  93. package/contracts/test/TestSwapHost.sol +45 -0
  94. package/contracts/test/TestUtils.sol +180 -0
  95. package/contracts/test/TestValidator.sol +10 -0
  96. package/contracts/utils/Accounts.sol +42 -0
  97. package/contracts/utils/Assets.sol +71 -0
  98. package/contracts/utils/Channels.sol +9 -0
  99. package/contracts/utils/ECDSA.sol +36 -0
  100. package/contracts/utils/Ids.sol +75 -0
  101. package/contracts/utils/Layout.sol +20 -0
  102. package/contracts/utils/Strings.sol +16 -0
  103. package/contracts/utils/Utils.sol +117 -0
  104. package/contracts/utils/Value.sol +18 -0
  105. package/package.json +29 -0
@@ -0,0 +1,149 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ import {Host} from "../core/Host.sol";
5
+ import {
6
+ AddLiquidityFromCustodiesToBalances,
7
+ RemoveLiquidityFromCustodyToBalances,
8
+ AddLiquidityFromBalancesToBalances,
9
+ RemoveLiquidityFromBalanceToBalances
10
+ } from "../commands/Liquidity.sol";
11
+ import {Data} from "../blocks/Data.sol";
12
+ import {AssetAmount, DataPairRef, DataRef, HostAmount, Writer} from "../blocks/Schema.sol";
13
+ import {Writers} from "../blocks/Writers.sol";
14
+ import {toHostId} from "../utils/Ids.sol";
15
+
16
+ using Data for DataRef;
17
+ using Writers for Writer;
18
+
19
+ contract TestLiquidityHost is
20
+ Host,
21
+ AddLiquidityFromCustodiesToBalances,
22
+ RemoveLiquidityFromCustodyToBalances,
23
+ AddLiquidityFromBalancesToBalances,
24
+ RemoveLiquidityFromBalanceToBalances
25
+ {
26
+ bytes32 internal constant LP_FROM_CUSTODIES_ASSET = bytes32(uint(0xaaa1));
27
+ bytes32 internal constant LP_FROM_BALANCES_ASSET = bytes32(uint(0xaaa2));
28
+ bytes32 internal constant REDEEM_FROM_CUSTODY_ASSET = bytes32(uint(0xbbb1));
29
+ bytes32 internal constant REDEEM_FROM_BALANCE_ASSET = bytes32(uint(0xbbb2));
30
+
31
+ event AddCustodiesMapped(
32
+ bytes32 account,
33
+ bytes32 assetA,
34
+ uint amountA,
35
+ bytes32 assetB,
36
+ uint amountB,
37
+ bytes routeData
38
+ );
39
+ event RemoveCustodyMapped(bytes32 account, bytes32 asset, uint amount, bytes routeData);
40
+ event AddBalancesMapped(
41
+ bytes32 account,
42
+ bytes32 assetA,
43
+ uint amountA,
44
+ bytes32 assetB,
45
+ uint amountB,
46
+ bytes routeData
47
+ );
48
+ event RemoveBalanceMapped(bytes32 account, bytes32 asset, uint amount, bytes routeData);
49
+ event MinimumObserved(bytes32 asset, bytes32 meta, uint amount);
50
+
51
+ constructor(address cmdr)
52
+ Host(address(0), 1, "test")
53
+ AddLiquidityFromCustodiesToBalances("route(bytes data)", 15_000)
54
+ RemoveLiquidityFromCustodyToBalances("route(bytes data)", 20_000)
55
+ AddLiquidityFromBalancesToBalances("route(bytes data)", 15_000)
56
+ RemoveLiquidityFromBalanceToBalances("route(bytes data)", 20_000)
57
+ {
58
+ if (cmdr != address(0)) access(toHostId(cmdr), true);
59
+ }
60
+
61
+ function addLiquidityFromCustodiesToBalances(
62
+ bytes32 account,
63
+ DataPairRef memory rawCustodies,
64
+ DataRef memory rawRoute,
65
+ Writer memory out
66
+ ) internal override {
67
+ HostAmount memory a = rawCustodies.a.toCustodyValue();
68
+ HostAmount memory b = rawCustodies.b.toCustodyValue();
69
+ bytes calldata routeData = msg.data[rawRoute.i:rawRoute.bound];
70
+ uint routeLen = rawRoute.bound - rawRoute.i;
71
+ emit AddCustodiesMapped(account, a.asset, a.amount, b.asset, b.amount, routeData);
72
+ emitMinimum(rawRoute);
73
+
74
+ out.appendBalance(a.asset, a.meta, a.amount + routeLen);
75
+ out.appendBalance(b.asset, b.meta, b.amount + routeLen + 1);
76
+ out.appendBalance(LP_FROM_CUSTODIES_ASSET, bytes32(routeLen), a.amount + b.amount);
77
+ }
78
+
79
+ function removeLiquidityFromCustodyToBalances(
80
+ bytes32 account,
81
+ HostAmount memory custody,
82
+ DataRef memory rawRoute,
83
+ Writer memory out
84
+ ) internal override {
85
+ bytes calldata routeData = msg.data[rawRoute.i:rawRoute.bound];
86
+ uint routeLen = rawRoute.bound - rawRoute.i;
87
+ emit RemoveCustodyMapped(account, custody.asset, custody.amount, routeData);
88
+ emitMinimum(rawRoute);
89
+
90
+ out.appendBalance(custody.asset, custody.meta, custody.amount + routeLen);
91
+ out.appendBalance(REDEEM_FROM_CUSTODY_ASSET, bytes32(routeLen), custody.amount + 10);
92
+ }
93
+
94
+ function addLiquidityFromBalancesToBalances(
95
+ bytes32 account,
96
+ DataPairRef memory rawBalances,
97
+ DataRef memory rawRoute,
98
+ Writer memory out
99
+ ) internal override {
100
+ AssetAmount memory a = rawBalances.a.toBalanceValue();
101
+ AssetAmount memory b = rawBalances.b.toBalanceValue();
102
+ bytes calldata routeData = msg.data[rawRoute.i:rawRoute.bound];
103
+ uint routeLen = rawRoute.bound - rawRoute.i;
104
+ emit AddBalancesMapped(account, a.asset, a.amount, b.asset, b.amount, routeData);
105
+ emitMinimum(rawRoute);
106
+
107
+ out.appendBalance(a.asset, a.meta, a.amount + routeLen);
108
+ out.appendBalance(b.asset, b.meta, b.amount + routeLen + 2);
109
+ out.appendBalance(LP_FROM_BALANCES_ASSET, bytes32(routeLen), a.amount + b.amount);
110
+ }
111
+
112
+ function removeLiquidityFromBalanceToBalances(
113
+ bytes32 account,
114
+ AssetAmount memory balance,
115
+ DataRef memory rawRoute,
116
+ Writer memory out
117
+ ) internal override {
118
+ bytes calldata routeData = msg.data[rawRoute.i:rawRoute.bound];
119
+ uint routeLen = rawRoute.bound - rawRoute.i;
120
+ emit RemoveBalanceMapped(account, balance.asset, balance.amount, routeData);
121
+ emitMinimum(rawRoute);
122
+
123
+ out.appendBalance(balance.asset, balance.meta, balance.amount + routeLen);
124
+ out.appendBalance(REDEEM_FROM_BALANCE_ASSET, bytes32(routeLen), balance.amount + 20);
125
+ }
126
+
127
+ function emitMinimum(DataRef memory rawRoute) internal {
128
+ if (rawRoute.bound < rawRoute.end) {
129
+ (bytes32 asset, bytes32 meta, uint amount) = rawRoute.innerMinimum();
130
+ emit MinimumObserved(asset, meta, amount);
131
+ }
132
+ }
133
+
134
+ function getAddLiquidityFromCustodiesToBalancesId() external view returns (uint) {
135
+ return addLiquidityFromCustodiesToBalancesId;
136
+ }
137
+
138
+ function getRemoveLiquidityFromCustodyToBalancesId() external view returns (uint) {
139
+ return removeLiquidityFromCustodyToBalancesId;
140
+ }
141
+
142
+ function getAddLiquidityFromBalancesToBalancesId() external view returns (uint) {
143
+ return addLiquidityFromBalancesToBalancesId;
144
+ }
145
+
146
+ function getRemoveLiquidityFromBalanceToBalancesId() external view returns (uint) {
147
+ return removeLiquidityFromBalanceToBalancesId;
148
+ }
149
+ }
@@ -0,0 +1,40 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ import {Host} from "../core/Host.sol";
5
+ import {MintToBalances} from "../commands/Mint.sol";
6
+ import {DataRef, Writer} from "../blocks/Schema.sol";
7
+ import {Writers} from "../blocks/Writers.sol";
8
+ import {toHostId} from "../utils/Ids.sol";
9
+
10
+ using Writers for Writer;
11
+
12
+ contract TestMintHost is Host, MintToBalances {
13
+ event MintCalled(bytes32 account, bytes routeData);
14
+
15
+ bytes32 public returnAsset;
16
+ bytes32 public returnMeta;
17
+ uint public returnAmount;
18
+
19
+ constructor(address cmdr)
20
+ Host(address(0), 1, "test")
21
+ MintToBalances("", 10_000)
22
+ {
23
+ if (cmdr != address(0)) access(toHostId(cmdr), true);
24
+ }
25
+
26
+ function setReturn(bytes32 asset, bytes32 meta, uint amount) external {
27
+ returnAsset = asset;
28
+ returnMeta = meta;
29
+ returnAmount = amount;
30
+ }
31
+
32
+ function mintToBalances(bytes32 account, DataRef memory rawRoute, Writer memory out) internal override {
33
+ bytes calldata routeData = msg.data[rawRoute.i:rawRoute.bound];
34
+ emit MintCalled(account, routeData);
35
+ if (returnAmount > 0) out.appendBalance(returnAsset, returnMeta, returnAmount);
36
+ }
37
+
38
+ function getMintId() external view returns (uint) { return mintToBalancesId; }
39
+ function getAdminAccount() external view returns (bytes32) { return adminAccount; }
40
+ }
@@ -0,0 +1,34 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ import {Host} from "../core/Host.sol";
5
+ import {PeerPull} from "../peer/Pull.sol";
6
+ import {PeerPush} from "../peer/Push.sol";
7
+ import {DataRef} from "../blocks/Schema.sol";
8
+ import {toHostId} from "../utils/Ids.sol";
9
+
10
+ contract TestPeerHost is Host, PeerPull, PeerPush {
11
+ event PeerPullCalled(bytes routeData);
12
+ event PeerPushCalled(bytes routeData);
13
+
14
+ constructor(address cmdr)
15
+ Host(address(0), 1, "test")
16
+ PeerPull("")
17
+ PeerPush("")
18
+ {
19
+ if (cmdr != address(0)) access(toHostId(cmdr), true);
20
+ }
21
+
22
+ function peerPull(DataRef memory rawRoute) internal override {
23
+ bytes calldata routeData = msg.data[rawRoute.i:rawRoute.bound];
24
+ emit PeerPullCalled(routeData);
25
+ }
26
+
27
+ function peerPush(DataRef memory rawRoute) internal override {
28
+ bytes calldata routeData = msg.data[rawRoute.i:rawRoute.bound];
29
+ emit PeerPushCalled(routeData);
30
+ }
31
+
32
+ function getPeerPullId() external view returns (uint) { return peerPullId; }
33
+ function getPeerPushId() external view returns (uint) { return peerPushId; }
34
+ }
@@ -0,0 +1,47 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ import {Host} from "../core/Host.sol";
5
+ import {ReclaimToBalances} from "../commands/Reclaim.sol";
6
+ import {AssetAmount, DataRef, Writer} from "../blocks/Schema.sol";
7
+ import {Data} from "../blocks/Data.sol";
8
+ import {Writers} from "../blocks/Writers.sol";
9
+ import {toHostId} from "../utils/Ids.sol";
10
+
11
+ using Data for DataRef;
12
+ using Writers for Writer;
13
+
14
+ contract TestReclaimHost is Host, ReclaimToBalances {
15
+ event ReclaimCalled(bytes32 account, bytes32 asset, bytes32 meta, uint amount, bytes routeData);
16
+
17
+ bytes32 public returnAsset;
18
+ bytes32 public returnMeta;
19
+ uint public returnAmount;
20
+
21
+ constructor(address cmdr)
22
+ Host(address(0), 1, "test")
23
+ ReclaimToBalances("", 10_000)
24
+ {
25
+ if (cmdr != address(0)) access(toHostId(cmdr), true);
26
+ }
27
+
28
+ function setReturn(bytes32 asset, bytes32 meta, uint amount) external {
29
+ returnAsset = asset;
30
+ returnMeta = meta;
31
+ returnAmount = amount;
32
+ }
33
+
34
+ function reclaimToBalances(
35
+ bytes32 account,
36
+ AssetAmount memory amount,
37
+ DataRef memory rawRoute,
38
+ Writer memory out
39
+ ) internal override {
40
+ bytes calldata routeData = msg.data[rawRoute.i:rawRoute.bound];
41
+ emit ReclaimCalled(account, amount.asset, amount.meta, amount.amount, routeData);
42
+ if (returnAmount > 0) out.appendBalance(returnAsset, returnMeta, returnAmount);
43
+ }
44
+
45
+ function getReclaimBalanceId() external view returns (uint) { return reclaimToBalancesId; }
46
+ function getAdminAccount() external view returns (bytes32) { return adminAccount; }
47
+ }
@@ -0,0 +1,8 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ contract TestRejectEther {
5
+ receive() external payable {
6
+ revert("NO_ETH");
7
+ }
8
+ }
@@ -0,0 +1,26 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ import {Host} from "../core/Host.sol";
5
+ import {Remove} from "../commands/Remove.sol";
6
+ import {DataRef} from "../blocks/Schema.sol";
7
+ import {toHostId} from "../utils/Ids.sol";
8
+
9
+ contract TestRemoveHost is Host, Remove {
10
+ event RemoveCalled(bytes32 account, bytes routeData);
11
+
12
+ constructor(address cmdr)
13
+ Host(address(0), 1, "test")
14
+ Remove("")
15
+ {
16
+ if (cmdr != address(0)) access(toHostId(cmdr), true);
17
+ }
18
+
19
+ function remove(bytes32 account, DataRef memory rawRoute) internal override {
20
+ bytes calldata routeData = msg.data[rawRoute.i:rawRoute.bound];
21
+ emit RemoveCalled(account, routeData);
22
+ }
23
+
24
+ function getRemoveId() external view returns (uint) { return removeId; }
25
+ function getAdminAccount() external view returns (bytes32) { return adminAccount; }
26
+ }
@@ -0,0 +1,45 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ import {Host} from "../core/Host.sol";
5
+ import {SwapExactBalanceToBalance} from "../commands/Swap.sol";
6
+ import {AssetAmount, DataRef} from "../Schema.sol";
7
+ import {Data} from "../blocks/Data.sol";
8
+
9
+ using Data for DataRef;
10
+
11
+ contract TestSwapHost is Host, SwapExactBalanceToBalance {
12
+ event SwapMapped(bytes32 account, bytes32 asset, bytes32 meta, uint amount, bytes routeData);
13
+ event SwapMinimum(bytes32 asset, bytes32 meta, uint amount);
14
+
15
+ constructor(address fastish)
16
+ Host(fastish, 1, "test")
17
+ SwapExactBalanceToBalance("route(bytes data)")
18
+ {}
19
+
20
+ function swapExactBalanceToBalance(
21
+ bytes32 account,
22
+ AssetAmount memory balance,
23
+ DataRef memory rawRoute
24
+ ) internal override returns (AssetAmount memory out) {
25
+ bytes calldata routeData = msg.data[rawRoute.i:rawRoute.bound];
26
+ emit SwapMapped(account, balance.asset, balance.meta, balance.amount, routeData);
27
+ if (rawRoute.bound < rawRoute.end) {
28
+ (bytes32 minAsset, bytes32 minMeta, uint minAmount) = rawRoute.innerMinimum();
29
+ emit SwapMinimum(minAsset, minMeta, minAmount);
30
+ }
31
+ return AssetAmount({
32
+ asset: balance.asset,
33
+ meta: bytes32(rawRoute.bound - rawRoute.i),
34
+ amount: balance.amount + (rawRoute.bound - rawRoute.i)
35
+ });
36
+ }
37
+
38
+ function getSwapExactInAsset32Id() external view returns (uint) {
39
+ return swapExactBalanceToBalanceId;
40
+ }
41
+
42
+ function getAdminAccount() external view returns (bytes32) {
43
+ return adminAccount;
44
+ }
45
+ }
@@ -0,0 +1,180 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ import {addrOr, toAdminAccount, toUserAccount, accountEvmAddr, isAdminAccount, ensureEvmAccount} from "../utils/Accounts.sol";
5
+ import {
6
+ toValueAsset,
7
+ toErc20Asset,
8
+ toErc721Asset,
9
+ isAsset32,
10
+ resolveAmount,
11
+ ensureAmount,
12
+ ensureAssetRef,
13
+ localErc20Addr,
14
+ localErc721Issuer
15
+ } from "../utils/Assets.sol";
16
+ import {toHostId, toCommandId, toCommandSelector, isHost, isCommand, localNodeAddr, localHostAddr, ensureHost, ensureCommand} from "../utils/Ids.sol";
17
+ import {applyBps, beforeBps, isFamily, isLocal, isLocalFamily, matchesBase, toLocalBase, toUnspecifiedBase, max8, max16, max32, max64, max128, max160} from "../utils/Utils.sol";
18
+ import {msgValue, useValue, ValueBudget} from "../utils/Value.sol";
19
+ import {bytes32ToString} from "../utils/Strings.sol";
20
+
21
+ contract TestUtils {
22
+ function testAddrOr(address addr, address or_) external pure returns (address) {
23
+ return addrOr(addr, or_);
24
+ }
25
+
26
+ function testToAdminAccount(address addr) external view returns (bytes32) {
27
+ return toAdminAccount(addr);
28
+ }
29
+
30
+ function testToUserAccount(address addr) external pure returns (bytes32) {
31
+ return toUserAccount(addr);
32
+ }
33
+
34
+ function testAccountEvmAddr(bytes32 account) external pure returns (address) {
35
+ return accountEvmAddr(account);
36
+ }
37
+
38
+ function testIsAdminAccount(bytes32 account) external pure returns (bool) {
39
+ return isAdminAccount(account);
40
+ }
41
+
42
+ function testToValueAsset() external view returns (bytes32) {
43
+ return toValueAsset();
44
+ }
45
+
46
+ function testToErc20Asset(address addr) external view returns (bytes32) {
47
+ return toErc20Asset(addr);
48
+ }
49
+
50
+ function testToErc721Asset(address addr) external view returns (bytes32) {
51
+ return toErc721Asset(addr);
52
+ }
53
+
54
+ function testIsAsset32(bytes32 asset) external pure returns (bool) {
55
+ return isAsset32(asset);
56
+ }
57
+
58
+ function testResolveAmount(uint available, uint min, uint max) external pure returns (uint) {
59
+ return resolveAmount(available, min, max);
60
+ }
61
+
62
+ function testEnsureAmount(uint amount) external pure returns (uint) {
63
+ return ensureAmount(amount);
64
+ }
65
+
66
+ function testEnsureAmountRange(uint amount, uint min, uint max) external pure returns (uint) {
67
+ return ensureAmount(amount, min, max);
68
+ }
69
+
70
+ function testEnsureAssetRef(bytes32 asset, bytes32 meta) external pure returns (bytes32) {
71
+ return ensureAssetRef(asset, meta);
72
+ }
73
+
74
+ function testLocalErc20Addr(bytes32 asset) external view returns (address) {
75
+ return localErc20Addr(asset);
76
+ }
77
+
78
+ function testLocalErc721Issuer(bytes32 asset) external view returns (address) {
79
+ return localErc721Issuer(asset);
80
+ }
81
+
82
+ function testToHostId(address addr) external view returns (uint) {
83
+ return toHostId(addr);
84
+ }
85
+
86
+ function testToCommandId(bytes32 name, address addr) external view returns (uint) {
87
+ return toCommandId(toCommandSelector(name), addr);
88
+ }
89
+
90
+ function testToCommandSelector(bytes32 name) external pure returns (bytes4) {
91
+ return toCommandSelector(name);
92
+ }
93
+
94
+ function testIsHost(uint id) external pure returns (bool) {
95
+ return isHost(id);
96
+ }
97
+
98
+ function testIsCommand(uint id) external pure returns (bool) {
99
+ return isCommand(id);
100
+ }
101
+
102
+ function testLocalNodeAddr(uint node) external view returns (address) {
103
+ return localNodeAddr(node);
104
+ }
105
+
106
+ function testLocalHostAddr(uint host) external view returns (address) {
107
+ return localHostAddr(host);
108
+ }
109
+
110
+ function testEnsureHost(uint id, address addr) external view returns (uint) {
111
+ return ensureHost(id, addr);
112
+ }
113
+
114
+ function testEnsureCommand(uint id) external pure returns (uint) {
115
+ return ensureCommand(id);
116
+ }
117
+
118
+ function testApplyBps(uint amount, uint16 bps) external pure returns (uint) {
119
+ return applyBps(amount, bps);
120
+ }
121
+
122
+ function testBeforeBps(uint amount, uint16 bps) external pure returns (uint) {
123
+ return beforeBps(amount, bps);
124
+ }
125
+
126
+ function testIsFamily(uint value, uint24 family) external pure returns (bool) {
127
+ return isFamily(value, family);
128
+ }
129
+
130
+ function testIsLocal(uint value) external view returns (bool) {
131
+ return isLocal(value);
132
+ }
133
+
134
+ function testMatchesBase(bytes32 value, uint base) external pure returns (bool) {
135
+ return matchesBase(value, base);
136
+ }
137
+
138
+ function testToLocalBase(uint32 prefix) external view returns (uint) {
139
+ return toLocalBase(prefix);
140
+ }
141
+
142
+ function testMsgValue() external payable returns (uint) {
143
+ ValueBudget memory budget = msgValue();
144
+ return budget.remaining;
145
+ }
146
+
147
+ function testUseValue(uint amount, uint remaining) external pure returns (uint spent, uint remainingAfter) {
148
+ ValueBudget memory budget = ValueBudget({remaining: remaining});
149
+ spent = useValue(amount, budget);
150
+ remainingAfter = budget.remaining;
151
+ }
152
+
153
+ function testBytes32ToString(bytes32 value) external pure returns (string memory) {
154
+ return bytes32ToString(value);
155
+ }
156
+
157
+ function testMax8(uint value) external pure returns (uint) {
158
+ return max8(value);
159
+ }
160
+
161
+ function testMax16(uint value) external pure returns (uint) {
162
+ return max16(value);
163
+ }
164
+
165
+ function testMax32(uint value) external pure returns (uint) {
166
+ return max32(value);
167
+ }
168
+
169
+ function testMax64(uint value) external pure returns (uint) {
170
+ return max64(value);
171
+ }
172
+
173
+ function testMax128(uint value) external pure returns (uint) {
174
+ return max128(value);
175
+ }
176
+
177
+ function testMax160(uint value) external pure returns (uint) {
178
+ return max160(value);
179
+ }
180
+ }
@@ -0,0 +1,10 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ import {Validator} from "../core/Validator.sol";
5
+
6
+ contract TestValidator is Validator {
7
+ function testVerify(bytes32 hash, uint192 nonce, bytes calldata proof) external returns (address) {
8
+ return verify(hash, nonce, proof);
9
+ }
10
+ }
@@ -0,0 +1,42 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ import {ACCOUNT, ADMIN, EVM32, USER} from "./Layout.sol";
5
+ import {isFamily, toLocalBase, toUnspecifiedBase} from "./Utils.sol";
6
+
7
+ error InvalidAccount();
8
+
9
+ uint24 constant ACCOUNT_FAMILY = (uint24(EVM32) << 8) | uint24(ACCOUNT);
10
+ uint32 constant ADMIN_PREFIX = (uint32(EVM32) << 16) | (uint32(ACCOUNT) << 8) | uint32(ADMIN);
11
+ uint32 constant USER_PREFIX = (uint32(EVM32) << 16) | (uint32(ACCOUNT) << 8) | uint32(USER);
12
+
13
+ function addrOr(address addr, address or) pure returns (address) {
14
+ return addr == address(0) ? or : addr;
15
+ }
16
+
17
+ function accountPrefix(bytes32 account) pure returns (uint32) {
18
+ return uint32(uint(account) >> 224);
19
+ }
20
+
21
+ function isAdminAccount(bytes32 account) pure returns (bool) {
22
+ return accountPrefix(account) == ADMIN_PREFIX;
23
+ }
24
+
25
+ function toAdminAccount(address addr) view returns (bytes32) {
26
+ return bytes32(toLocalBase(ADMIN_PREFIX) | (uint(uint160(addr)) << 32));
27
+ }
28
+
29
+ function toUserAccount(address addr) pure returns (bytes32) {
30
+ return bytes32(toUnspecifiedBase(USER_PREFIX) | (uint(uint160(addr)) << 32));
31
+ }
32
+
33
+ function ensureEvmAccount(bytes32 account) pure {
34
+ if (!isFamily(uint(account), ACCOUNT_FAMILY)) {
35
+ revert InvalidAccount();
36
+ }
37
+ }
38
+
39
+ function accountEvmAddr(bytes32 account) pure returns (address) {
40
+ ensureEvmAccount(account);
41
+ return address(uint160(uint(account) >> 32));
42
+ }
@@ -0,0 +1,71 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ import {ASSET, ERC20, ERC721, EVM32, VALUE} from "./Layout.sol";
5
+ import {matchesBase, toLocalBase} from "./Utils.sol";
6
+
7
+ uint32 constant VALUE_PREFIX = (uint32(EVM32) << 16) | (uint32(ASSET) << 8) | uint32(VALUE);
8
+ uint32 constant ERC20_PREFIX = (uint32(EVM32) << 16) | (uint32(ASSET) << 8) | uint32(ERC20);
9
+ uint32 constant ERC721_PREFIX = (uint32(EVM32) << 16) | (uint32(ASSET) << 8) | uint32(ERC721);
10
+
11
+ error ZeroAmount();
12
+ error InvalidAsset();
13
+ error BadAmount(uint amount);
14
+
15
+ function isAsset32(bytes32 asset) pure returns (bool) {
16
+ return bytes1(asset) == 0x20;
17
+ }
18
+
19
+ function toValueAsset() view returns (bytes32) {
20
+ return bytes32(toLocalBase(VALUE_PREFIX));
21
+ }
22
+
23
+ function toErc20Asset(address addr) view returns (bytes32) {
24
+ return bytes32(toLocalBase(ERC20_PREFIX) | (uint(uint160(addr)) << 32));
25
+ }
26
+
27
+ function toErc721Asset(address issuer) view returns (bytes32) {
28
+ return bytes32(toLocalBase(ERC721_PREFIX) | (uint(uint160(issuer)) << 32));
29
+ }
30
+
31
+ function resolveAmount(uint available, uint min, uint max) pure returns (uint) {
32
+ uint amount = available > max ? max : available;
33
+ if (amount < min) {
34
+ revert BadAmount(amount);
35
+ }
36
+ return amount;
37
+ }
38
+
39
+ function ensureAmount(uint amount) pure returns (uint) {
40
+ if (amount == 0) {
41
+ revert ZeroAmount();
42
+ }
43
+ return amount;
44
+ }
45
+
46
+ function ensureAmount(uint amount, uint min, uint max) pure returns (uint) {
47
+ if (amount < min || amount > max) {
48
+ revert BadAmount(amount);
49
+ }
50
+ return amount;
51
+ }
52
+
53
+ function ensureAssetRef(bytes32 asset, bytes32 meta) pure returns (bytes32) {
54
+ if (asset == 0 || (bytes1(asset) == 0x20 && meta != 0)) revert InvalidAsset();
55
+ return bytes1(asset) == 0x20 ? asset : keccak256(bytes.concat(asset, meta));
56
+ }
57
+
58
+ function ensureBalanceRef(bytes32 asset, bytes32 meta, uint amount) pure returns (bytes32 ref) {
59
+ ensureAmount(amount);
60
+ return ensureAssetRef(asset, meta);
61
+ }
62
+
63
+ function localErc20Addr(bytes32 asset) view returns (address) {
64
+ if (!matchesBase(asset, toLocalBase(ERC20_PREFIX))) revert InvalidAsset();
65
+ return address(uint160(uint(asset) >> 32));
66
+ }
67
+
68
+ function localErc721Issuer(bytes32 asset) view returns (address) {
69
+ if (!matchesBase(asset, toLocalBase(ERC721_PREFIX))) revert InvalidAsset();
70
+ return address(uint160(uint(asset) >> 32));
71
+ }
@@ -0,0 +1,9 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ pragma solidity ^0.8.33;
3
+
4
+ uint8 constant SETUP = 0x0001;
5
+ uint8 constant PIPE = 0x0002;
6
+ uint8 constant BALANCES = 0x0003;
7
+ uint8 constant TRANSACTIONS = 0x0004;
8
+ uint8 constant CUSTODIES = 0x0005;
9
+ uint8 constant CLAIMS = 0x0006;