Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(blst): add new blst to all packages with bls #5493

Closed
wants to merge 31 commits into from

Conversation

matthewkeil
Copy link
Member

@matthewkeil matthewkeil commented May 15, 2023

Motivation

The @chainsafe/blst library was rebuilt with Napi to put bls work on the libuv thread pool in-lieu of a worker thread. The goal is to lower the overhead for bls work and to share it across all worker threads to increase bls throughput and to lower worker thread overhead. There will also be no latency with the messaging between workers.

Description

Swapped out sync for async functions for all bls calls on main thread in packages/beacon-node

Inclusions in packages/beacon-node

  • update package.json to include @chainsafe/blst

Implementation notes for review

  • getAggregatedPubkey in beacon-node/src/chain/bls/utils.ts has a SWIG signatureSet (from @lodestar/state-transition) as param so converted in function to new binding format... not ideal but want to prevent upstream changes

These two were dependency of functions inside and outside of worker thread. were converted to two functions (sync and async:

  • verifySignatureSetsMaybeBatch in beacon-node/src/chain/bls/maybeBatch.ts
  • getAggregatedPubkey in beacon-node/src/chain/bls/utils.ts

Files that still have @chainsafe/bls:

  • beacon-node/src/chain/bls/maybeBatch.ts
  • beacon-node/src/chain/bls/utils.ts
  • beacon-node/src/chain/bls/multithread/index.ts
  • beacon-node/src/chain/bls/multithread/worker.ts

@CLAassistant
Copy link

CLAassistant commented May 15, 2023

CLA assistant check
All committers have signed the CLA.

@matthewkeil matthewkeil changed the title DRAFT: feat(blst): add new blst to all packages with bls feat(blst): add new blst to all packages with bls May 15, 2023
@dapplion
Copy link
Contributor

@matthewkeil Please do not replace bls everywhere, only in the hot path verifying gossip data in the beacon chain. Such that do not change any other package beyond the beacon-node

@@ -98,6 +98,7 @@
"@chainsafe/as-chacha20poly1305": "^0.1.0",
"@chainsafe/as-sha256": "^0.3.1",
"@chainsafe/bls": "7.1.1",
"@chainsafe/blst": "file:../../../blst-ts-2/rebuild",
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dapplion I have the new bindings stubbed in using a file import. How would you prefer I handle this for CI? Should I publish a version to @matthewkeil/blst or something similar? Or perhaps an odd semVer number that we can delete from @chainsage/blst?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I published at blst-ts-test for now

@matthewkeil matthewkeil marked this pull request as ready for review May 17, 2023 06:25
@matthewkeil matthewkeil requested a review from a team as a code owner May 17, 2023 06:25
@matthewkeil matthewkeil marked this pull request as draft May 17, 2023 06:28
@matthewkeil matthewkeil marked this pull request as ready for review May 17, 2023 07:53
@matthewkeil matthewkeil marked this pull request as draft May 18, 2023 04:10
@matthewkeil
Copy link
Member Author

there was a build error on linux. I am updating the bindings and I built a workflow to test all three platforms in the @chainsafe/blst repo. I got my laptop setup this evening as well so it will be faster to debug the linux build issues now

@github-actions
Copy link
Contributor

github-actions bot commented May 18, 2023

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: abdda43 Previous: 3da2287 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 743.54 us/op 754.64 us/op 0.99
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 45.941 us/op 44.856 us/op 1.02
BLS verify - Napi 1.5958 ms/op
BLS verifyMultipleSignatures 3 - Napi 2.8170 ms/op
BLS verifyMultipleSignatures 8 - Napi 5.9002 ms/op
BLS verifyMultipleSignatures 32 - Napi 20.921 ms/op
BLS aggregatePubkeys 32 - Napi 1.8710 ms/op
BLS aggregatePubkeys 128 - Napi 7.4153 ms/op
getAttestationsForBlock 59.653 ms/op 50.286 ms/op 1.19
isKnown best case - 1 super set check 262.00 ns/op 253.00 ns/op 1.04
isKnown normal case - 2 super set checks 261.00 ns/op 247.00 ns/op 1.06
isKnown worse case - 16 super set checks 259.00 ns/op 246.00 ns/op 1.05
CheckpointStateCache - add get delete 5.2010 us/op 4.8790 us/op 1.07
validate gossip signedAggregateAndProof - struct 2.6942 ms/op 2.7421 ms/op 0.98
validate gossip attestation - struct 1.4188 ms/op 1.3096 ms/op 1.08
pickEth1Vote - no votes 1.2661 ms/op 1.2298 ms/op 1.03
pickEth1Vote - max votes 9.2531 ms/op 10.367 ms/op 0.89
pickEth1Vote - Eth1Data hashTreeRoot value x2048 8.8728 ms/op 8.6869 ms/op 1.02
pickEth1Vote - Eth1Data hashTreeRoot tree x2048 17.433 ms/op 13.729 ms/op 1.27
pickEth1Vote - Eth1Data fastSerialize value x2048 649.09 us/op 629.39 us/op 1.03
pickEth1Vote - Eth1Data fastSerialize tree x2048 6.5086 ms/op 7.9418 ms/op 0.82
bytes32 toHexString 496.00 ns/op 494.00 ns/op 1.00
bytes32 Buffer.toString(hex) 353.00 ns/op 355.00 ns/op 0.99
bytes32 Buffer.toString(hex) from Uint8Array 545.00 ns/op 568.00 ns/op 0.96
bytes32 Buffer.toString(hex) + 0x 346.00 ns/op 348.00 ns/op 0.99
Object access 1 prop 0.17300 ns/op 0.16300 ns/op 1.06
Map access 1 prop 0.17000 ns/op 0.15500 ns/op 1.10
Object get x1000 7.2740 ns/op 6.8720 ns/op 1.06
Map get x1000 0.60600 ns/op 0.53200 ns/op 1.14
Object set x1000 52.177 ns/op 49.024 ns/op 1.06
Map set x1000 44.755 ns/op 40.889 ns/op 1.09
Return object 10000 times 0.24240 ns/op 0.22490 ns/op 1.08
Throw Error 10000 times 4.2408 us/op 4.0236 us/op 1.05
fastMsgIdFn sha256 / 200 bytes 3.5150 us/op 3.2860 us/op 1.07
fastMsgIdFn h32 xxhash / 200 bytes 291.00 ns/op 274.00 ns/op 1.06
fastMsgIdFn h64 xxhash / 200 bytes 418.00 ns/op 392.00 ns/op 1.07
fastMsgIdFn sha256 / 1000 bytes 11.703 us/op 11.069 us/op 1.06
fastMsgIdFn h32 xxhash / 1000 bytes 426.00 ns/op 393.00 ns/op 1.08
fastMsgIdFn h64 xxhash / 1000 bytes 488.00 ns/op 458.00 ns/op 1.07
fastMsgIdFn sha256 / 10000 bytes 105.33 us/op 99.504 us/op 1.06
fastMsgIdFn h32 xxhash / 10000 bytes 1.9630 us/op 1.8010 us/op 1.09
fastMsgIdFn h64 xxhash / 10000 bytes 1.3740 us/op 1.2820 us/op 1.07
enrSubnets - fastDeserialize 64 bits 1.2590 us/op 1.2120 us/op 1.04
enrSubnets - ssz BitVector 64 bits 503.00 ns/op 475.00 ns/op 1.06
enrSubnets - fastDeserialize 4 bits 173.00 ns/op 165.00 ns/op 1.05
enrSubnets - ssz BitVector 4 bits 513.00 ns/op 471.00 ns/op 1.09
prioritizePeers score -10:0 att 32-0.1 sync 2-0 105.10 us/op 102.17 us/op 1.03
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 133.30 us/op 126.61 us/op 1.05
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 172.65 us/op 162.90 us/op 1.06
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 313.40 us/op 287.91 us/op 1.09
prioritizePeers score 0:0 att 64-1 sync 4-1 377.71 us/op 349.69 us/op 1.08
array of 16000 items push then shift 1.6875 us/op 1.5614 us/op 1.08
LinkedList of 16000 items push then shift 8.8900 ns/op 8.4490 ns/op 1.05
array of 16000 items push then pop 102.29 ns/op 82.096 ns/op 1.25
LinkedList of 16000 items push then pop 8.7130 ns/op 8.4950 ns/op 1.03
array of 24000 items push then shift 2.4069 us/op 2.3398 us/op 1.03
LinkedList of 24000 items push then shift 8.9500 ns/op 8.7280 ns/op 1.03
array of 24000 items push then pop 89.205 ns/op 73.858 ns/op 1.21
LinkedList of 24000 items push then pop 8.7610 ns/op 8.3910 ns/op 1.04
intersect bitArray bitLen 8 13.331 ns/op 13.162 ns/op 1.01
intersect array and set length 8 81.826 ns/op 76.556 ns/op 1.07
intersect bitArray bitLen 128 44.572 ns/op 43.651 ns/op 1.02
intersect array and set length 128 1.1716 us/op 1.0451 us/op 1.12
Buffer.concat 32 items 2.7080 us/op 2.7970 us/op 0.97
Uint8Array.set 32 items 2.9070 us/op 3.2420 us/op 0.90
pass gossip attestations to forkchoice per slot 3.1669 ms/op 2.2019 ms/op 1.44
computeDeltas 3.0676 ms/op 3.4148 ms/op 0.90
computeProposerBoostScoreFromBalances 1.8246 ms/op 1.6962 ms/op 1.08
altair processAttestation - 250000 vs - 7PWei normalcase 2.6083 ms/op 2.0433 ms/op 1.28
altair processAttestation - 250000 vs - 7PWei worstcase 3.6933 ms/op 3.2219 ms/op 1.15
altair processAttestation - setStatus - 1/6 committees join 146.63 us/op 131.35 us/op 1.12
altair processAttestation - setStatus - 1/3 committees join 286.30 us/op 272.45 us/op 1.05
altair processAttestation - setStatus - 1/2 committees join 380.09 us/op 363.55 us/op 1.05
altair processAttestation - setStatus - 2/3 committees join 479.17 us/op 455.07 us/op 1.05
altair processAttestation - setStatus - 4/5 committees join 693.77 us/op 622.74 us/op 1.11
altair processAttestation - setStatus - 100% committees join 782.91 us/op 726.91 us/op 1.08
altair processBlock - 250000 vs - 7PWei normalcase 19.802 ms/op 15.883 ms/op 1.25
altair processBlock - 250000 vs - 7PWei normalcase hashState 27.650 ms/op 27.121 ms/op 1.02
altair processBlock - 250000 vs - 7PWei worstcase 56.813 ms/op 46.095 ms/op 1.23
altair processBlock - 250000 vs - 7PWei worstcase hashState 78.146 ms/op 71.631 ms/op 1.09
phase0 processBlock - 250000 vs - 7PWei normalcase 2.2835 ms/op 1.9151 ms/op 1.19
phase0 processBlock - 250000 vs - 7PWei worstcase 31.256 ms/op 27.182 ms/op 1.15
altair processEth1Data - 250000 vs - 7PWei normalcase 580.83 us/op 461.45 us/op 1.26
vc - 250000 eb 1 eth1 1 we 0 wn 0 - smpl 15 8.6160 us/op 6.7100 us/op 1.28
vc - 250000 eb 0.95 eth1 0.1 we 0.05 wn 0 - smpl 219 28.282 us/op 19.347 us/op 1.46
vc - 250000 eb 0.95 eth1 0.3 we 0.05 wn 0 - smpl 42 14.569 us/op 8.3890 us/op 1.74
vc - 250000 eb 0.95 eth1 0.7 we 0.05 wn 0 - smpl 18 8.6160 us/op 6.1810 us/op 1.39
vc - 250000 eb 0.1 eth1 0.1 we 0 wn 0 - smpl 1020 105.22 us/op 74.387 us/op 1.41
vc - 250000 eb 0.03 eth1 0.03 we 0 wn 0 - smpl 11777 773.11 us/op 623.88 us/op 1.24
vc - 250000 eb 0.01 eth1 0.01 we 0 wn 0 - smpl 16384 1.0328 ms/op 875.18 us/op 1.18
vc - 250000 eb 0 eth1 0 we 0 wn 0 - smpl 16384 1.0188 ms/op 892.41 us/op 1.14
vc - 250000 eb 0 eth1 0 we 0 wn 0 nocache - smpl 16384 2.4429 ms/op 2.1141 ms/op 1.16
vc - 250000 eb 0 eth1 1 we 0 wn 0 - smpl 16384 1.5666 ms/op 1.4872 ms/op 1.05
vc - 250000 eb 0 eth1 1 we 0 wn 0 nocache - smpl 16384 4.9475 ms/op 3.7673 ms/op 1.31
Tree 40 250000 create 356.07 ms/op 295.47 ms/op 1.21
Tree 40 250000 get(125000) 199.97 ns/op 178.89 ns/op 1.12
Tree 40 250000 set(125000) 1.0127 us/op 891.98 ns/op 1.14
Tree 40 250000 toArray() 21.914 ms/op 16.542 ms/op 1.32
Tree 40 250000 iterate all - toArray() + loop 22.231 ms/op 16.636 ms/op 1.34
Tree 40 250000 iterate all - get(i) 76.734 ms/op 65.843 ms/op 1.17
MutableVector 250000 create 12.369 ms/op 10.737 ms/op 1.15
MutableVector 250000 get(125000) 6.3170 ns/op 6.2030 ns/op 1.02
MutableVector 250000 set(125000) 283.09 ns/op 245.06 ns/op 1.16
MutableVector 250000 toArray() 3.7523 ms/op 2.6440 ms/op 1.42
MutableVector 250000 iterate all - toArray() + loop 3.2692 ms/op 2.7997 ms/op 1.17
MutableVector 250000 iterate all - get(i) 1.5319 ms/op 1.5552 ms/op 0.99
Array 250000 create 3.1727 ms/op 2.4914 ms/op 1.27
Array 250000 clone - spread 1.1304 ms/op 1.1684 ms/op 0.97
Array 250000 get(125000) 0.56500 ns/op 0.56400 ns/op 1.00
Array 250000 set(125000) 0.65800 ns/op 0.71400 ns/op 0.92
Array 250000 iterate all - loop 83.367 us/op 100.16 us/op 0.83
effectiveBalanceIncrements clone Uint8Array 300000 40.806 us/op 25.405 us/op 1.61
effectiveBalanceIncrements clone MutableVector 300000 346.00 ns/op 375.00 ns/op 0.92
effectiveBalanceIncrements rw all Uint8Array 300000 174.52 us/op 165.04 us/op 1.06
effectiveBalanceIncrements rw all MutableVector 300000 82.914 ms/op 80.401 ms/op 1.03
phase0 afterProcessEpoch - 250000 vs - 7PWei 114.75 ms/op 112.22 ms/op 1.02
phase0 beforeProcessEpoch - 250000 vs - 7PWei 45.373 ms/op 32.202 ms/op 1.41
altair processEpoch - mainnet_e81889 349.29 ms/op 327.87 ms/op 1.07
mainnet_e81889 - altair beforeProcessEpoch 72.340 ms/op 68.606 ms/op 1.05
mainnet_e81889 - altair processJustificationAndFinalization 17.208 us/op 19.729 us/op 0.87
mainnet_e81889 - altair processInactivityUpdates 6.4012 ms/op 5.4433 ms/op 1.18
mainnet_e81889 - altair processRewardsAndPenalties 72.477 ms/op 52.844 ms/op 1.37
mainnet_e81889 - altair processRegistryUpdates 3.3780 us/op 3.5630 us/op 0.95
mainnet_e81889 - altair processSlashings 463.00 ns/op 483.00 ns/op 0.96
mainnet_e81889 - altair processEth1DataReset 535.00 ns/op 476.00 ns/op 1.12
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.5148 ms/op 1.2576 ms/op 1.20
mainnet_e81889 - altair processSlashingsReset 4.1060 us/op 3.5310 us/op 1.16
mainnet_e81889 - altair processRandaoMixesReset 4.3450 us/op 4.3550 us/op 1.00
mainnet_e81889 - altair processHistoricalRootsUpdate 557.00 ns/op 528.00 ns/op 1.05
mainnet_e81889 - altair processParticipationFlagUpdates 4.6210 us/op 2.4630 us/op 1.88
mainnet_e81889 - altair processSyncCommitteeUpdates 722.00 ns/op 485.00 ns/op 1.49
mainnet_e81889 - altair afterProcessEpoch 128.13 ms/op 119.31 ms/op 1.07
phase0 processEpoch - mainnet_e58758 380.58 ms/op 314.90 ms/op 1.21
mainnet_e58758 - phase0 beforeProcessEpoch 146.48 ms/op 119.53 ms/op 1.23
mainnet_e58758 - phase0 processJustificationAndFinalization 15.315 us/op 16.032 us/op 0.96
mainnet_e58758 - phase0 processRewardsAndPenalties 65.543 ms/op 56.491 ms/op 1.16
mainnet_e58758 - phase0 processRegistryUpdates 7.6900 us/op 7.5340 us/op 1.02
mainnet_e58758 - phase0 processSlashings 471.00 ns/op 392.00 ns/op 1.20
mainnet_e58758 - phase0 processEth1DataReset 483.00 ns/op 408.00 ns/op 1.18
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 1.2182 ms/op 940.20 us/op 1.30
mainnet_e58758 - phase0 processSlashingsReset 4.1550 us/op 3.0400 us/op 1.37
mainnet_e58758 - phase0 processRandaoMixesReset 4.4710 us/op 4.3050 us/op 1.04
mainnet_e58758 - phase0 processHistoricalRootsUpdate 554.00 ns/op 540.00 ns/op 1.03
mainnet_e58758 - phase0 processParticipationRecordUpdates 3.7400 us/op 3.7410 us/op 1.00
mainnet_e58758 - phase0 afterProcessEpoch 99.146 ms/op 91.087 ms/op 1.09
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.2401 ms/op 1.2306 ms/op 1.01
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.8877 ms/op 1.4231 ms/op 1.33
altair processInactivityUpdates - 250000 normalcase 19.664 ms/op 19.828 ms/op 0.99
altair processInactivityUpdates - 250000 worstcase 27.583 ms/op 19.474 ms/op 1.42
phase0 processRegistryUpdates - 250000 normalcase 5.7190 us/op 6.1940 us/op 0.92
phase0 processRegistryUpdates - 250000 badcase_full_deposits 305.75 us/op 224.67 us/op 1.36
phase0 processRegistryUpdates - 250000 worstcase 0.5 134.55 ms/op 111.41 ms/op 1.21
altair processRewardsAndPenalties - 250000 normalcase 72.473 ms/op 45.767 ms/op 1.58
altair processRewardsAndPenalties - 250000 worstcase 73.455 ms/op 50.638 ms/op 1.45
phase0 getAttestationDeltas - 250000 normalcase 7.1606 ms/op 6.1008 ms/op 1.17
phase0 getAttestationDeltas - 250000 worstcase 6.7177 ms/op 6.4630 ms/op 1.04
phase0 processSlashings - 250000 worstcase 3.4191 ms/op 3.4819 ms/op 0.98
altair processSyncCommitteeUpdates - 250000 175.21 ms/op 167.79 ms/op 1.04
BeaconState.hashTreeRoot - No change 283.00 ns/op 260.00 ns/op 1.09
BeaconState.hashTreeRoot - 1 full validator 54.496 us/op 49.124 us/op 1.11
BeaconState.hashTreeRoot - 32 full validator 555.38 us/op 502.70 us/op 1.10
BeaconState.hashTreeRoot - 512 full validator 5.8758 ms/op 5.0532 ms/op 1.16
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 62.210 us/op 61.054 us/op 1.02
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 902.23 us/op 906.99 us/op 0.99
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 12.534 ms/op 10.732 ms/op 1.17
BeaconState.hashTreeRoot - 1 balances 49.975 us/op 46.303 us/op 1.08
BeaconState.hashTreeRoot - 32 balances 502.98 us/op 443.19 us/op 1.13
BeaconState.hashTreeRoot - 512 balances 5.1785 ms/op 4.3200 ms/op 1.20
BeaconState.hashTreeRoot - 250000 balances 82.444 ms/op 74.698 ms/op 1.10
aggregationBits - 2048 els - zipIndexesInBitList 15.765 us/op 16.296 us/op 0.97
regular array get 100000 times 36.127 us/op 32.634 us/op 1.11
wrappedArray get 100000 times 33.094 us/op 32.667 us/op 1.01
arrayWithProxy get 100000 times 15.421 ms/op 15.678 ms/op 0.98
ssz.Root.equals 545.00 ns/op 542.00 ns/op 1.01
byteArrayEquals 536.00 ns/op 534.00 ns/op 1.00
shuffle list - 16384 els 6.8837 ms/op 6.5738 ms/op 1.05
shuffle list - 250000 els 100.30 ms/op 96.127 ms/op 1.04
processSlot - 1 slots 9.4450 us/op 8.6620 us/op 1.09
processSlot - 32 slots 1.3762 ms/op 1.3222 ms/op 1.04
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 38.227 ms/op 33.346 ms/op 1.15
getCommitteeAssignments - req 1 vs - 250000 vc 3.0594 ms/op 2.8793 ms/op 1.06
getCommitteeAssignments - req 100 vs - 250000 vc 4.2937 ms/op 4.0637 ms/op 1.06
getCommitteeAssignments - req 1000 vs - 250000 vc 4.5941 ms/op 4.4084 ms/op 1.04
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 5.1300 ns/op 4.3500 ns/op 1.18
state getBlockRootAtSlot - 250000 vs - 7PWei 835.29 ns/op 931.54 ns/op 0.90
computeProposers - vc 250000 10.422 ms/op 9.8074 ms/op 1.06
computeEpochShuffling - vc 250000 105.74 ms/op 97.652 ms/op 1.08
getNextSyncCommittee - vc 250000 186.80 ms/op 170.43 ms/op 1.10
computeSigningRoot for AttestationData 13.693 us/op 13.723 us/op 1.00
hash AttestationData serialized data then Buffer.toString(base64) 2.5253 us/op 2.3818 us/op 1.06
toHexString serialized data 1.0930 us/op 1.0456 us/op 1.05
Buffer.toString(base64) 317.51 ns/op 313.98 ns/op 1.01

by benchmarkbot/action

@matthewkeil matthewkeil marked this pull request as ready for review May 18, 2023 09:18
@matthewkeil
Copy link
Member Author

matthewkeil commented May 18, 2023

Preliminary Results

deployed at: 8:30am EST
metrics at: 2:30pm EST (roughly. took a few min to go through and take them all)

Not all metrics are shown here. Just the ones that notable difference was seen (both better and worse).

instance: feat3-lg1k-hzax41

Screen Shot 2023-05-18 at 2 16 02 PM Screen Shot 2023-05-18 at 2 16 37 PM Screen Shot 2023-05-18 at 2 16 50 PM Screen Shot 2023-05-18 at 2 18 32 PM Screen Shot 2023-05-18 at 2 16 20 PM Screen Shot 2023-05-18 at 2 17 10 PM Screen Shot 2023-05-18 at 2 17 21 PM Screen Shot 2023-05-18 at 2 17 55 PM

instance: feat3-sm1v-ctvpss

Screen Shot 2023-05-18 at 2 34 03 PM Screen Shot 2023-05-18 at 2 34 26 PM Screen Shot 2023-05-18 at 2 34 41 PM Screen Shot 2023-05-18 at 2 37 27 PM Screen Shot 2023-05-18 at 2 38 32 PM Screen Shot 2023-05-18 at 2 38 24 PM Screen Shot 2023-05-18 at 2 38 16 PM Screen Shot 2023-05-18 at 2 38 08 PM Screen Shot 2023-05-18 at 2 37 43 PM Screen Shot 2023-05-18 at 2 38 43 PM

@dapplion dapplion marked this pull request as draft May 29, 2023 12:15
@dapplion
Copy link
Contributor

Converting to draft as this must not be merged until extensive testing in mainnet + internal audit of the lib

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants