diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..59225a60
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "print.colourScheme": "Gruvbox"
+}
\ No newline at end of file
diff --git a/election-guard/.github/workflows/test.yml b/election-guard/.github/workflows/test.yml
new file mode 100644
index 00000000..09880b1d
--- /dev/null
+++ b/election-guard/.github/workflows/test.yml
@@ -0,0 +1,34 @@
+name: test
+
+on: workflow_dispatch
+
+env:
+ FOUNDRY_PROFILE: ci
+
+jobs:
+ check:
+ strategy:
+ fail-fast: true
+
+ name: Foundry project
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Run Forge build
+ run: |
+ forge --version
+ forge build --sizes
+ id: build
+
+ - name: Run Forge tests
+ run: |
+ forge test -vvv
+ id: test
diff --git a/election-guard/.gitignore b/election-guard/.gitignore
new file mode 100644
index 00000000..85198aaa
--- /dev/null
+++ b/election-guard/.gitignore
@@ -0,0 +1,14 @@
+# Compiler files
+cache/
+out/
+
+# Ignores development broadcast logs
+!/broadcast
+/broadcast/*/31337/
+/broadcast/**/dry-run/
+
+# Docs
+docs/
+
+# Dotenv file
+.env
diff --git a/election-guard/.gitmodules b/election-guard/.gitmodules
new file mode 100644
index 00000000..d4d7804d
--- /dev/null
+++ b/election-guard/.gitmodules
@@ -0,0 +1,7 @@
+[submodule "lib/forge-std"]
+ path = lib/forge-std
+ url = https://github.com/foundry-rs/forge-std
+
+[submodule "lib/forge-std"]
+ path = lib/safe-contracts
+ url = https://github.com/safe-global/safe-contracts
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/100/run-1688860866.json b/election-guard/broadcast/ElectionGuard.s.sol/100/run-1688860866.json
new file mode 100644
index 00000000..a5316b16
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/100/run-1688860866.json
@@ -0,0 +1,33 @@
+{
+ "transactions": [
+ {
+ "hash": "0x92925a194871da6d3ca8343543a9a7efa44fe19b592f50de44b08ca1aa590add",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0xf345cf6240960A79CFb0ee1Db8A42f6A92e52ee3",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x9dacc",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610807806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c3660046103e1565b6100ca565b60405190151581526020015b60405180910390f35b61004c6100843660046104e0565b610101565b61004c6100973660046105d6565b61033c565b6100bc6100aa366004610606565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d919061061f565b6101779190610638565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906106c1565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f8919061061f565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d60405161024899989796959493929190610737565b60405180910390a360008181526020819052604080822084905551633b31d65360e11b81526004810183905273ece86f082e7f11525886d4c9b6b04b5875de381e91908290637663aca690602401602060405180830381865afa1580156102b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d791906107b4565b90508061032b5760405162461bcd60e51b815260206004820152601c60248201527f456c656374696f6e206e6f7420796574207375636365737366756c2e0000000060448201526064015b60405180910390fd5b505050505050505050505050505050565b600082815260208190526040812054908190036103915760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b6044820152606401610322565b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b6000602082840312156103f357600080fd5b81356001600160e01b03198116811461040b57600080fd5b9392505050565b80356001600160a01b038116811461042957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261045557600080fd5b813567ffffffffffffffff808211156104705761047061042e565b604051601f8301601f19908116603f011681019082821181831017156104985761049861042e565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061042957600080fd5b60008060008060008060008060008060006101608c8e03121561050257600080fd5b61050b8c610412565b9a5060208c0135995067ffffffffffffffff8060408e0135111561052e57600080fd5b61053e8e60408f01358f01610444565b995061054c60608e016104d1565b985060808d0135975060a08d0135965060c08d0135955061056f60e08e01610412565b945061057e6101008e01610412565b9350806101208e0135111561059257600080fd5b506105a48d6101208e01358e01610444565b91506105b36101408d01610412565b90509295989b509295989b9093969950565b80151581146105d357600080fd5b50565b600080604083850312156105e957600080fd5b8235915060208301356105fb816105c5565b809150509250929050565b60006020828403121561061857600080fd5b5035919050565b60006020828403121561063157600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b8181101561067f57602081850181015186830182015201610663565b506000602082860101526020601f19601f83011685010191505092915050565b600281106106bd57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b9052610140604083018190526000916106ee8483018d610659565b92506106fd606085018c61069f565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a9052610120604083018190526000916107648483018c610659565b9150610773606085018b61069f565b88608085015287151560a08501528660c085015283820360e08501526107998287610659565b925080851661010085015250509a9950505050505050505050565b6000602082840312156107c657600080fd5b815161040b816105c556fea2646970667358221220578847ec10bfc4f06452f3b38bd7d9b43d3713856652d2021d5a9b34ce7acf7664736f6c63430008100033",
+ "nonce": "0x2",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [],
+ "libraries": [],
+ "pending": [
+ "0x92925a194871da6d3ca8343543a9a7efa44fe19b592f50de44b08ca1aa590add"
+ ],
+ "returns": {},
+ "timestamp": 1688860866,
+ "chain": 100,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/100/run-1688860872.json b/election-guard/broadcast/ElectionGuard.s.sol/100/run-1688860872.json
new file mode 100644
index 00000000..64579690
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/100/run-1688860872.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x92925a194871da6d3ca8343543a9a7efa44fe19b592f50de44b08ca1aa590add",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0xf345cf6240960A79CFb0ee1Db8A42f6A92e52ee3",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x9dacc",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610807806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c3660046103e1565b6100ca565b60405190151581526020015b60405180910390f35b61004c6100843660046104e0565b610101565b61004c6100973660046105d6565b61033c565b6100bc6100aa366004610606565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d919061061f565b6101779190610638565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906106c1565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f8919061061f565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d60405161024899989796959493929190610737565b60405180910390a360008181526020819052604080822084905551633b31d65360e11b81526004810183905273ece86f082e7f11525886d4c9b6b04b5875de381e91908290637663aca690602401602060405180830381865afa1580156102b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d791906107b4565b90508061032b5760405162461bcd60e51b815260206004820152601c60248201527f456c656374696f6e206e6f7420796574207375636365737366756c2e0000000060448201526064015b60405180910390fd5b505050505050505050505050505050565b600082815260208190526040812054908190036103915760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b6044820152606401610322565b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b6000602082840312156103f357600080fd5b81356001600160e01b03198116811461040b57600080fd5b9392505050565b80356001600160a01b038116811461042957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261045557600080fd5b813567ffffffffffffffff808211156104705761047061042e565b604051601f8301601f19908116603f011681019082821181831017156104985761049861042e565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061042957600080fd5b60008060008060008060008060008060006101608c8e03121561050257600080fd5b61050b8c610412565b9a5060208c0135995067ffffffffffffffff8060408e0135111561052e57600080fd5b61053e8e60408f01358f01610444565b995061054c60608e016104d1565b985060808d0135975060a08d0135965060c08d0135955061056f60e08e01610412565b945061057e6101008e01610412565b9350806101208e0135111561059257600080fd5b506105a48d6101208e01358e01610444565b91506105b36101408d01610412565b90509295989b509295989b9093969950565b80151581146105d357600080fd5b50565b600080604083850312156105e957600080fd5b8235915060208301356105fb816105c5565b809150509250929050565b60006020828403121561061857600080fd5b5035919050565b60006020828403121561063157600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b8181101561067f57602081850181015186830182015201610663565b506000602082860101526020601f19601f83011685010191505092915050565b600281106106bd57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b9052610140604083018190526000916106ee8483018d610659565b92506106fd606085018c61069f565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a9052610120604083018190526000916107648483018c610659565b9150610773606085018b61069f565b88608085015287151560a08501528660c085015283820360e08501526107998287610659565b925080851661010085015250509a9950505050505050505050565b6000602082840312156107c657600080fd5b815161040b816105c556fea2646970667358221220578847ec10bfc4f06452f3b38bd7d9b43d3713856652d2021d5a9b34ce7acf7664736f6c63430008100033",
+ "nonce": "0x2",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x92925a194871da6d3ca8343543a9a7efa44fe19b592f50de44b08ca1aa590add",
+ "transactionIndex": "0x0",
+ "blockHash": "0x98f39e10ef444583ff2fa4fed34becfab562e8c0911f372dfb08e1252028187d",
+ "blockNumber": "0x1b84654",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0x7949d",
+ "gasUsed": "0x7949d",
+ "contractAddress": "0xf345cf6240960A79CFb0ee1Db8A42f6A92e52ee3",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e07"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688860872,
+ "chain": 100,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/100/run-latest.json b/election-guard/broadcast/ElectionGuard.s.sol/100/run-latest.json
new file mode 100644
index 00000000..64579690
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/100/run-latest.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x92925a194871da6d3ca8343543a9a7efa44fe19b592f50de44b08ca1aa590add",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0xf345cf6240960A79CFb0ee1Db8A42f6A92e52ee3",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x9dacc",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610807806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c3660046103e1565b6100ca565b60405190151581526020015b60405180910390f35b61004c6100843660046104e0565b610101565b61004c6100973660046105d6565b61033c565b6100bc6100aa366004610606565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d919061061f565b6101779190610638565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906106c1565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f8919061061f565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d60405161024899989796959493929190610737565b60405180910390a360008181526020819052604080822084905551633b31d65360e11b81526004810183905273ece86f082e7f11525886d4c9b6b04b5875de381e91908290637663aca690602401602060405180830381865afa1580156102b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d791906107b4565b90508061032b5760405162461bcd60e51b815260206004820152601c60248201527f456c656374696f6e206e6f7420796574207375636365737366756c2e0000000060448201526064015b60405180910390fd5b505050505050505050505050505050565b600082815260208190526040812054908190036103915760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b6044820152606401610322565b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b6000602082840312156103f357600080fd5b81356001600160e01b03198116811461040b57600080fd5b9392505050565b80356001600160a01b038116811461042957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261045557600080fd5b813567ffffffffffffffff808211156104705761047061042e565b604051601f8301601f19908116603f011681019082821181831017156104985761049861042e565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061042957600080fd5b60008060008060008060008060008060006101608c8e03121561050257600080fd5b61050b8c610412565b9a5060208c0135995067ffffffffffffffff8060408e0135111561052e57600080fd5b61053e8e60408f01358f01610444565b995061054c60608e016104d1565b985060808d0135975060a08d0135965060c08d0135955061056f60e08e01610412565b945061057e6101008e01610412565b9350806101208e0135111561059257600080fd5b506105a48d6101208e01358e01610444565b91506105b36101408d01610412565b90509295989b509295989b9093969950565b80151581146105d357600080fd5b50565b600080604083850312156105e957600080fd5b8235915060208301356105fb816105c5565b809150509250929050565b60006020828403121561061857600080fd5b5035919050565b60006020828403121561063157600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b8181101561067f57602081850181015186830182015201610663565b506000602082860101526020601f19601f83011685010191505092915050565b600281106106bd57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b9052610140604083018190526000916106ee8483018d610659565b92506106fd606085018c61069f565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a9052610120604083018190526000916107648483018c610659565b9150610773606085018b61069f565b88608085015287151560a08501528660c085015283820360e08501526107998287610659565b925080851661010085015250509a9950505050505050505050565b6000602082840312156107c657600080fd5b815161040b816105c556fea2646970667358221220578847ec10bfc4f06452f3b38bd7d9b43d3713856652d2021d5a9b34ce7acf7664736f6c63430008100033",
+ "nonce": "0x2",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x92925a194871da6d3ca8343543a9a7efa44fe19b592f50de44b08ca1aa590add",
+ "transactionIndex": "0x0",
+ "blockHash": "0x98f39e10ef444583ff2fa4fed34becfab562e8c0911f372dfb08e1252028187d",
+ "blockNumber": "0x1b84654",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0x7949d",
+ "gasUsed": "0x7949d",
+ "contractAddress": "0xf345cf6240960A79CFb0ee1Db8A42f6A92e52ee3",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e07"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688860872,
+ "chain": 100,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688811585.json b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688811585.json
new file mode 100644
index 00000000..53d337c4
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688811585.json
@@ -0,0 +1,33 @@
+{
+ "transactions": [
+ {
+ "hash": "0x8a16a50bb037b81b04abfaf923a11d1ad37f349e54805c13fb15362a2cffd9e9",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0xc6D1A7c5218A8C68cB4Dd40D63539640e4530FB0",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x8ce3c",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610712806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c366004610315565b6100ca565b60405190151581526020015b60405180910390f35b61004c610084366004610414565b610101565b61004c6100973660046104f9565b61026c565b6100bc6100aa36600461052e565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d9190610547565b6101779190610560565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906105e9565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f89190610547565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d6040516102489998979695949392919061065f565b60405180910390a36000908152602081905260409020555050505050505050505050565b600082815260208190526040812054908190036102c55760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b604482015260640160405180910390fd5b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b60006020828403121561032757600080fd5b81356001600160e01b03198116811461033f57600080fd5b9392505050565b80356001600160a01b038116811461035d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261038957600080fd5b813567ffffffffffffffff808211156103a4576103a4610362565b604051601f8301601f19908116603f011681019082821181831017156103cc576103cc610362565b816040528381528660208588010111156103e557600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061035d57600080fd5b60008060008060008060008060008060006101608c8e03121561043657600080fd5b61043f8c610346565b9a5060208c0135995067ffffffffffffffff8060408e0135111561046257600080fd5b6104728e60408f01358f01610378565b995061048060608e01610405565b985060808d0135975060a08d0135965060c08d013595506104a360e08e01610346565b94506104b26101008e01610346565b9350806101208e013511156104c657600080fd5b506104d88d6101208e01358e01610378565b91506104e76101408d01610346565b90509295989b509295989b9093969950565b6000806040838503121561050c57600080fd5b823591506020830135801515811461052357600080fd5b809150509250929050565b60006020828403121561054057600080fd5b5035919050565b60006020828403121561055957600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b818110156105a75760208185018101518683018201520161058b565b506000602082860101526020601f19601f83011685010191505092915050565b600281106105e557634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b9052610140604083018190526000916106168483018d610581565b9250610625606085018c6105c7565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a90526101206040830181905260009161068c8483018c610581565b915061069b606085018b6105c7565b88608085015287151560a08501528660c085015283820360e08501526106c18287610581565b925080851661010085015250509a995050505050505050505056fea2646970667358221220e413bf0750cfbdd72b98dd838d710c82003576cb58c0e3c828aedc17368a50ed64736f6c63430008100033",
+ "nonce": "0x0",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [],
+ "libraries": [],
+ "pending": [
+ "0x8a16a50bb037b81b04abfaf923a11d1ad37f349e54805c13fb15362a2cffd9e9"
+ ],
+ "returns": {},
+ "timestamp": 1688811585,
+ "chain": 5,
+ "multi": false,
+ "commit": "fc0a078"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688811592.json b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688811592.json
new file mode 100644
index 00000000..39012364
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688811592.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x8a16a50bb037b81b04abfaf923a11d1ad37f349e54805c13fb15362a2cffd9e9",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0xc6D1A7c5218A8C68cB4Dd40D63539640e4530FB0",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x8ce3c",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610712806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c366004610315565b6100ca565b60405190151581526020015b60405180910390f35b61004c610084366004610414565b610101565b61004c6100973660046104f9565b61026c565b6100bc6100aa36600461052e565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d9190610547565b6101779190610560565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906105e9565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f89190610547565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d6040516102489998979695949392919061065f565b60405180910390a36000908152602081905260409020555050505050505050505050565b600082815260208190526040812054908190036102c55760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b604482015260640160405180910390fd5b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b60006020828403121561032757600080fd5b81356001600160e01b03198116811461033f57600080fd5b9392505050565b80356001600160a01b038116811461035d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261038957600080fd5b813567ffffffffffffffff808211156103a4576103a4610362565b604051601f8301601f19908116603f011681019082821181831017156103cc576103cc610362565b816040528381528660208588010111156103e557600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061035d57600080fd5b60008060008060008060008060008060006101608c8e03121561043657600080fd5b61043f8c610346565b9a5060208c0135995067ffffffffffffffff8060408e0135111561046257600080fd5b6104728e60408f01358f01610378565b995061048060608e01610405565b985060808d0135975060a08d0135965060c08d013595506104a360e08e01610346565b94506104b26101008e01610346565b9350806101208e013511156104c657600080fd5b506104d88d6101208e01358e01610378565b91506104e76101408d01610346565b90509295989b509295989b9093969950565b6000806040838503121561050c57600080fd5b823591506020830135801515811461052357600080fd5b809150509250929050565b60006020828403121561054057600080fd5b5035919050565b60006020828403121561055957600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b818110156105a75760208185018101518683018201520161058b565b506000602082860101526020601f19601f83011685010191505092915050565b600281106105e557634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b9052610140604083018190526000916106168483018d610581565b9250610625606085018c6105c7565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a90526101206040830181905260009161068c8483018c610581565b915061069b606085018b6105c7565b88608085015287151560a08501528660c085015283820360e08501526106c18287610581565b925080851661010085015250509a995050505050505050505056fea2646970667358221220e413bf0750cfbdd72b98dd838d710c82003576cb58c0e3c828aedc17368a50ed64736f6c63430008100033",
+ "nonce": "0x0",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x8a16a50bb037b81b04abfaf923a11d1ad37f349e54805c13fb15362a2cffd9e9",
+ "transactionIndex": "0x3",
+ "blockHash": "0xd2f3b7fbd24dea34317401a1fb5e337be4dca5a9833fd0949d317d6c8a77614e",
+ "blockNumber": "0x8e1174",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0x9bc2b",
+ "gasUsed": "0x6c67b",
+ "contractAddress": "0xc6D1A7c5218A8C68cB4Dd40D63539640e4530FB0",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e0c"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688811592,
+ "chain": 5,
+ "multi": false,
+ "commit": "fc0a078"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857435.json b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857435.json
new file mode 100644
index 00000000..69337ead
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857435.json
@@ -0,0 +1,33 @@
+{
+ "transactions": [
+ {
+ "hash": "0xff1c7b4c91ca3597d834b57511ae3ace659aa3a29f98893a0825eb315eec4175",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0xf345cf6240960A79CFb0ee1Db8A42f6A92e52ee3",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x15f8d3",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50611317806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c36600461040f565b6100ca565b60405190151581526020015b60405180910390f35b61004c61008436600461050e565b610101565b61004c610097366004610604565b61035d565b6100bc6100aa366004610634565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d919061064d565b6101779190610666565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906106ef565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f8919061064d565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d60405161024899989796959493929190610765565b60405180910390a36000818152602081905260408082208490555161026c90610402565b604051809103906000f080158015610288573d6000803e3d6000fd5b50604051633b31d65360e11b8152600481018490529091506000906001600160a01b03831690637663aca690602401602060405180830381865afa1580156102d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f891906107e2565b90508061034c5760405162461bcd60e51b815260206004820152601c60248201527f456c656374696f6e206e6f7420796574207375636365737366756c2e0000000060448201526064015b60405180910390fd5b505050505050505050505050505050565b600082815260208190526040812054908190036103b25760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b6044820152606401610343565b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b610ae28061080083390190565b60006020828403121561042157600080fd5b81356001600160e01b03198116811461043957600080fd5b9392505050565b80356001600160a01b038116811461045757600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261048357600080fd5b813567ffffffffffffffff8082111561049e5761049e61045c565b604051601f8301601f19908116603f011681019082821181831017156104c6576104c661045c565b816040528381528660208588010111156104df57600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061045757600080fd5b60008060008060008060008060008060006101608c8e03121561053057600080fd5b6105398c610440565b9a5060208c0135995067ffffffffffffffff8060408e0135111561055c57600080fd5b61056c8e60408f01358f01610472565b995061057a60608e016104ff565b985060808d0135975060a08d0135965060c08d0135955061059d60e08e01610440565b94506105ac6101008e01610440565b9350806101208e013511156105c057600080fd5b506105d28d6101208e01358e01610472565b91506105e16101408d01610440565b90509295989b509295989b9093969950565b801515811461060157600080fd5b50565b6000806040838503121561061757600080fd5b823591506020830135610629816105f3565b809150509250929050565b60006020828403121561064657600080fd5b5035919050565b60006020828403121561065f57600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b818110156106ad57602081850181015186830182015201610691565b506000602082860101526020601f19601f83011685010191505092915050565b600281106106eb57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b90526101406040830181905260009161071c8483018d610687565b925061072b606085018c6106cd565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a9052610120604083018190526000916107928483018c610687565b91506107a1606085018b6106cd565b88608085015287151560a08501528660c085015283820360e08501526107c78287610687565b925080851661010085015250509a9950505050505050505050565b6000602082840312156107f457600080fd5b8151610439816105f356fe608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b81526000908190733172a66630be2be7d02f38d53dc038a090b82ea79063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea264697066735822122013ebc4d86d3b83ca47b9aa6d1cc4b3103a1d8dee996ed32520035662ee92727164736f6c63430008100033a2646970667358221220de5d34cb5188967501e32f7fb770257e3e98137606388fcec3fd528a5b072b6364736f6c63430008100033",
+ "nonce": "0x2",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [],
+ "libraries": [],
+ "pending": [
+ "0xff1c7b4c91ca3597d834b57511ae3ace659aa3a29f98893a0825eb315eec4175"
+ ],
+ "returns": {},
+ "timestamp": 1688857435,
+ "chain": 5,
+ "multi": false,
+ "commit": "de22031"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857448.json b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857448.json
new file mode 100644
index 00000000..73d42dc1
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857448.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0xff1c7b4c91ca3597d834b57511ae3ace659aa3a29f98893a0825eb315eec4175",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0xf345cf6240960A79CFb0ee1Db8A42f6A92e52ee3",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x15f8d3",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50611317806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c36600461040f565b6100ca565b60405190151581526020015b60405180910390f35b61004c61008436600461050e565b610101565b61004c610097366004610604565b61035d565b6100bc6100aa366004610634565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d919061064d565b6101779190610666565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906106ef565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f8919061064d565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d60405161024899989796959493929190610765565b60405180910390a36000818152602081905260408082208490555161026c90610402565b604051809103906000f080158015610288573d6000803e3d6000fd5b50604051633b31d65360e11b8152600481018490529091506000906001600160a01b03831690637663aca690602401602060405180830381865afa1580156102d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f891906107e2565b90508061034c5760405162461bcd60e51b815260206004820152601c60248201527f456c656374696f6e206e6f7420796574207375636365737366756c2e0000000060448201526064015b60405180910390fd5b505050505050505050505050505050565b600082815260208190526040812054908190036103b25760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b6044820152606401610343565b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b610ae28061080083390190565b60006020828403121561042157600080fd5b81356001600160e01b03198116811461043957600080fd5b9392505050565b80356001600160a01b038116811461045757600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261048357600080fd5b813567ffffffffffffffff8082111561049e5761049e61045c565b604051601f8301601f19908116603f011681019082821181831017156104c6576104c661045c565b816040528381528660208588010111156104df57600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061045757600080fd5b60008060008060008060008060008060006101608c8e03121561053057600080fd5b6105398c610440565b9a5060208c0135995067ffffffffffffffff8060408e0135111561055c57600080fd5b61056c8e60408f01358f01610472565b995061057a60608e016104ff565b985060808d0135975060a08d0135965060c08d0135955061059d60e08e01610440565b94506105ac6101008e01610440565b9350806101208e013511156105c057600080fd5b506105d28d6101208e01358e01610472565b91506105e16101408d01610440565b90509295989b509295989b9093969950565b801515811461060157600080fd5b50565b6000806040838503121561061757600080fd5b823591506020830135610629816105f3565b809150509250929050565b60006020828403121561064657600080fd5b5035919050565b60006020828403121561065f57600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b818110156106ad57602081850181015186830182015201610691565b506000602082860101526020601f19601f83011685010191505092915050565b600281106106eb57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b90526101406040830181905260009161071c8483018d610687565b925061072b606085018c6106cd565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a9052610120604083018190526000916107928483018c610687565b91506107a1606085018b6106cd565b88608085015287151560a08501528660c085015283820360e08501526107c78287610687565b925080851661010085015250509a9950505050505050505050565b6000602082840312156107f457600080fd5b8151610439816105f356fe608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b81526000908190733172a66630be2be7d02f38d53dc038a090b82ea79063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea264697066735822122013ebc4d86d3b83ca47b9aa6d1cc4b3103a1d8dee996ed32520035662ee92727164736f6c63430008100033a2646970667358221220de5d34cb5188967501e32f7fb770257e3e98137606388fcec3fd528a5b072b6364736f6c63430008100033",
+ "nonce": "0x2",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0xff1c7b4c91ca3597d834b57511ae3ace659aa3a29f98893a0825eb315eec4175",
+ "transactionIndex": "0x4",
+ "blockHash": "0xf4950649a056a7d0f411095c9bc03a79681b2e3bfbf942452956575ad49b1fc9",
+ "blockNumber": "0x8e1d30",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0x9ae84e",
+ "gasUsed": "0x10e7fe",
+ "contractAddress": "0xf345cf6240960A79CFb0ee1Db8A42f6A92e52ee3",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e0a"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688857448,
+ "chain": 5,
+ "multi": false,
+ "commit": "de22031"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857832.json b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857832.json
new file mode 100644
index 00000000..225a7e8c
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857832.json
@@ -0,0 +1,33 @@
+{
+ "transactions": [
+ {
+ "hash": "0xad3da0c8b38d6ddd4686acf7dc891af4eab8e562529e4b193d65e3394100fd46",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0x25626fD292b54bee5b920719adbcCf27c562F468",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x9dacc",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610807806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c3660046103e1565b6100ca565b60405190151581526020015b60405180910390f35b61004c6100843660046104e0565b610101565b61004c6100973660046105d6565b61033c565b6100bc6100aa366004610606565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d919061061f565b6101779190610638565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906106c1565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f8919061061f565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d60405161024899989796959493929190610737565b60405180910390a360008181526020819052604080822084905551633b31d65360e11b81526004810183905273c035175e22f76756fb06b7d1a9521b3f1f2431bc91908290637663aca690602401602060405180830381865afa1580156102b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d791906107b4565b90508061032b5760405162461bcd60e51b815260206004820152601c60248201527f456c656374696f6e206e6f7420796574207375636365737366756c2e0000000060448201526064015b60405180910390fd5b505050505050505050505050505050565b600082815260208190526040812054908190036103915760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b6044820152606401610322565b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b6000602082840312156103f357600080fd5b81356001600160e01b03198116811461040b57600080fd5b9392505050565b80356001600160a01b038116811461042957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261045557600080fd5b813567ffffffffffffffff808211156104705761047061042e565b604051601f8301601f19908116603f011681019082821181831017156104985761049861042e565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061042957600080fd5b60008060008060008060008060008060006101608c8e03121561050257600080fd5b61050b8c610412565b9a5060208c0135995067ffffffffffffffff8060408e0135111561052e57600080fd5b61053e8e60408f01358f01610444565b995061054c60608e016104d1565b985060808d0135975060a08d0135965060c08d0135955061056f60e08e01610412565b945061057e6101008e01610412565b9350806101208e0135111561059257600080fd5b506105a48d6101208e01358e01610444565b91506105b36101408d01610412565b90509295989b509295989b9093969950565b80151581146105d357600080fd5b50565b600080604083850312156105e957600080fd5b8235915060208301356105fb816105c5565b809150509250929050565b60006020828403121561061857600080fd5b5035919050565b60006020828403121561063157600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b8181101561067f57602081850181015186830182015201610663565b506000602082860101526020601f19601f83011685010191505092915050565b600281106106bd57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b9052610140604083018190526000916106ee8483018d610659565b92506106fd606085018c61069f565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a9052610120604083018190526000916107648483018c610659565b9150610773606085018b61069f565b88608085015287151560a08501528660c085015283820360e08501526107998287610659565b925080851661010085015250509a9950505050505050505050565b6000602082840312156107c657600080fd5b815161040b816105c556fea2646970667358221220489412575c236b9fa2b1ce7967459067fe0ab97efb8143c96edba241969758ab64736f6c63430008100033",
+ "nonce": "0x5",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [],
+ "libraries": [],
+ "pending": [
+ "0xad3da0c8b38d6ddd4686acf7dc891af4eab8e562529e4b193d65e3394100fd46"
+ ],
+ "returns": {},
+ "timestamp": 1688857832,
+ "chain": 5,
+ "multi": false,
+ "commit": "de22031"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857839.json b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857839.json
new file mode 100644
index 00000000..0f664b9a
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688857839.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0xad3da0c8b38d6ddd4686acf7dc891af4eab8e562529e4b193d65e3394100fd46",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0x25626fD292b54bee5b920719adbcCf27c562F468",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x9dacc",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610807806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c3660046103e1565b6100ca565b60405190151581526020015b60405180910390f35b61004c6100843660046104e0565b610101565b61004c6100973660046105d6565b61033c565b6100bc6100aa366004610606565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d919061061f565b6101779190610638565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906106c1565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f8919061061f565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d60405161024899989796959493929190610737565b60405180910390a360008181526020819052604080822084905551633b31d65360e11b81526004810183905273c035175e22f76756fb06b7d1a9521b3f1f2431bc91908290637663aca690602401602060405180830381865afa1580156102b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d791906107b4565b90508061032b5760405162461bcd60e51b815260206004820152601c60248201527f456c656374696f6e206e6f7420796574207375636365737366756c2e0000000060448201526064015b60405180910390fd5b505050505050505050505050505050565b600082815260208190526040812054908190036103915760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b6044820152606401610322565b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b6000602082840312156103f357600080fd5b81356001600160e01b03198116811461040b57600080fd5b9392505050565b80356001600160a01b038116811461042957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261045557600080fd5b813567ffffffffffffffff808211156104705761047061042e565b604051601f8301601f19908116603f011681019082821181831017156104985761049861042e565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061042957600080fd5b60008060008060008060008060008060006101608c8e03121561050257600080fd5b61050b8c610412565b9a5060208c0135995067ffffffffffffffff8060408e0135111561052e57600080fd5b61053e8e60408f01358f01610444565b995061054c60608e016104d1565b985060808d0135975060a08d0135965060c08d0135955061056f60e08e01610412565b945061057e6101008e01610412565b9350806101208e0135111561059257600080fd5b506105a48d6101208e01358e01610444565b91506105b36101408d01610412565b90509295989b509295989b9093969950565b80151581146105d357600080fd5b50565b600080604083850312156105e957600080fd5b8235915060208301356105fb816105c5565b809150509250929050565b60006020828403121561061857600080fd5b5035919050565b60006020828403121561063157600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b8181101561067f57602081850181015186830182015201610663565b506000602082860101526020601f19601f83011685010191505092915050565b600281106106bd57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b9052610140604083018190526000916106ee8483018d610659565b92506106fd606085018c61069f565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a9052610120604083018190526000916107648483018c610659565b9150610773606085018b61069f565b88608085015287151560a08501528660c085015283820360e08501526107998287610659565b925080851661010085015250509a9950505050505050505050565b6000602082840312156107c657600080fd5b815161040b816105c556fea2646970667358221220489412575c236b9fa2b1ce7967459067fe0ab97efb8143c96edba241969758ab64736f6c63430008100033",
+ "nonce": "0x5",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0xad3da0c8b38d6ddd4686acf7dc891af4eab8e562529e4b193d65e3394100fd46",
+ "transactionIndex": "0xa",
+ "blockHash": "0x8fb27f634554d7a3ae62172e1d95295311fe234cee95e0349813377aa120800e",
+ "blockNumber": "0x8e1d4e",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0xbce0d4",
+ "gasUsed": "0x79521",
+ "contractAddress": "0x25626fD292b54bee5b920719adbcCf27c562F468",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e07"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688857839,
+ "chain": 5,
+ "multi": false,
+ "commit": "de22031"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688859529.json b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688859529.json
new file mode 100644
index 00000000..cd94d702
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688859529.json
@@ -0,0 +1,33 @@
+{
+ "transactions": [
+ {
+ "hash": "0x774fcc561ccc150c04191058eec0c4c4d7c9f7aadd77300aef43f3dc1e49c677",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0xb90FA59dF34D1a2027cCaf6b5c2DD2cb3D60e7bE",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x9dacc",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610807806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c3660046103e1565b6100ca565b60405190151581526020015b60405180910390f35b61004c6100843660046104e0565b610101565b61004c6100973660046105d6565b61033c565b6100bc6100aa366004610606565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d919061061f565b6101779190610638565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906106c1565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f8919061061f565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d60405161024899989796959493929190610737565b60405180910390a360008181526020819052604080822084905551633b31d65360e11b81526004810183905273c76eb70e0d56284990ae3f46ffed5c1db3f19a7d91908290637663aca690602401602060405180830381865afa1580156102b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d791906107b4565b90508061032b5760405162461bcd60e51b815260206004820152601c60248201527f456c656374696f6e206e6f7420796574207375636365737366756c2e0000000060448201526064015b60405180910390fd5b505050505050505050505050505050565b600082815260208190526040812054908190036103915760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b6044820152606401610322565b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b6000602082840312156103f357600080fd5b81356001600160e01b03198116811461040b57600080fd5b9392505050565b80356001600160a01b038116811461042957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261045557600080fd5b813567ffffffffffffffff808211156104705761047061042e565b604051601f8301601f19908116603f011681019082821181831017156104985761049861042e565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061042957600080fd5b60008060008060008060008060008060006101608c8e03121561050257600080fd5b61050b8c610412565b9a5060208c0135995067ffffffffffffffff8060408e0135111561052e57600080fd5b61053e8e60408f01358f01610444565b995061054c60608e016104d1565b985060808d0135975060a08d0135965060c08d0135955061056f60e08e01610412565b945061057e6101008e01610412565b9350806101208e0135111561059257600080fd5b506105a48d6101208e01358e01610444565b91506105b36101408d01610412565b90509295989b509295989b9093969950565b80151581146105d357600080fd5b50565b600080604083850312156105e957600080fd5b8235915060208301356105fb816105c5565b809150509250929050565b60006020828403121561061857600080fd5b5035919050565b60006020828403121561063157600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b8181101561067f57602081850181015186830182015201610663565b506000602082860101526020601f19601f83011685010191505092915050565b600281106106bd57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b9052610140604083018190526000916106ee8483018d610659565b92506106fd606085018c61069f565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a9052610120604083018190526000916107648483018c610659565b9150610773606085018b61069f565b88608085015287151560a08501528660c085015283820360e08501526107998287610659565b925080851661010085015250509a9950505050505050505050565b6000602082840312156107c657600080fd5b815161040b816105c556fea264697066735822122065ddb9b6ddc19b6715eaa56dfb9bfc1c3c92f2fef2035e3c60b67e458bff47b164736f6c63430008100033",
+ "nonce": "0x7",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [],
+ "libraries": [],
+ "pending": [
+ "0x774fcc561ccc150c04191058eec0c4c4d7c9f7aadd77300aef43f3dc1e49c677"
+ ],
+ "returns": {},
+ "timestamp": 1688859529,
+ "chain": 5,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688859541.json b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688859541.json
new file mode 100644
index 00000000..895b314d
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/5/run-1688859541.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x774fcc561ccc150c04191058eec0c4c4d7c9f7aadd77300aef43f3dc1e49c677",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0xb90FA59dF34D1a2027cCaf6b5c2DD2cb3D60e7bE",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x9dacc",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610807806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c3660046103e1565b6100ca565b60405190151581526020015b60405180910390f35b61004c6100843660046104e0565b610101565b61004c6100973660046105d6565b61033c565b6100bc6100aa366004610606565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d919061061f565b6101779190610638565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906106c1565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f8919061061f565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d60405161024899989796959493929190610737565b60405180910390a360008181526020819052604080822084905551633b31d65360e11b81526004810183905273c76eb70e0d56284990ae3f46ffed5c1db3f19a7d91908290637663aca690602401602060405180830381865afa1580156102b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d791906107b4565b90508061032b5760405162461bcd60e51b815260206004820152601c60248201527f456c656374696f6e206e6f7420796574207375636365737366756c2e0000000060448201526064015b60405180910390fd5b505050505050505050505050505050565b600082815260208190526040812054908190036103915760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b6044820152606401610322565b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b6000602082840312156103f357600080fd5b81356001600160e01b03198116811461040b57600080fd5b9392505050565b80356001600160a01b038116811461042957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261045557600080fd5b813567ffffffffffffffff808211156104705761047061042e565b604051601f8301601f19908116603f011681019082821181831017156104985761049861042e565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061042957600080fd5b60008060008060008060008060008060006101608c8e03121561050257600080fd5b61050b8c610412565b9a5060208c0135995067ffffffffffffffff8060408e0135111561052e57600080fd5b61053e8e60408f01358f01610444565b995061054c60608e016104d1565b985060808d0135975060a08d0135965060c08d0135955061056f60e08e01610412565b945061057e6101008e01610412565b9350806101208e0135111561059257600080fd5b506105a48d6101208e01358e01610444565b91506105b36101408d01610412565b90509295989b509295989b9093969950565b80151581146105d357600080fd5b50565b600080604083850312156105e957600080fd5b8235915060208301356105fb816105c5565b809150509250929050565b60006020828403121561061857600080fd5b5035919050565b60006020828403121561063157600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b8181101561067f57602081850181015186830182015201610663565b506000602082860101526020601f19601f83011685010191505092915050565b600281106106bd57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b9052610140604083018190526000916106ee8483018d610659565b92506106fd606085018c61069f565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a9052610120604083018190526000916107648483018c610659565b9150610773606085018b61069f565b88608085015287151560a08501528660c085015283820360e08501526107998287610659565b925080851661010085015250509a9950505050505050505050565b6000602082840312156107c657600080fd5b815161040b816105c556fea264697066735822122065ddb9b6ddc19b6715eaa56dfb9bfc1c3c92f2fef2035e3c60b67e458bff47b164736f6c63430008100033",
+ "nonce": "0x7",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x774fcc561ccc150c04191058eec0c4c4d7c9f7aadd77300aef43f3dc1e49c677",
+ "transactionIndex": "0x1",
+ "blockHash": "0xfff11b7eef4b32cecdea88c00932243d22f3a5e51290ca0eb02f840f3651fb7c",
+ "blockNumber": "0x8e1dc3",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0x7e729",
+ "gasUsed": "0x79521",
+ "contractAddress": "0xb90FA59dF34D1a2027cCaf6b5c2DD2cb3D60e7bE",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e0a"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688859541,
+ "chain": 5,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ElectionGuard.s.sol/5/run-latest.json b/election-guard/broadcast/ElectionGuard.s.sol/5/run-latest.json
new file mode 100644
index 00000000..895b314d
--- /dev/null
+++ b/election-guard/broadcast/ElectionGuard.s.sol/5/run-latest.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x774fcc561ccc150c04191058eec0c4c4d7c9f7aadd77300aef43f3dc1e49c677",
+ "transactionType": "CREATE",
+ "contractName": "DebugTransactionGuard",
+ "contractAddress": "0xb90FA59dF34D1a2027cCaf6b5c2DD2cb3D60e7bE",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0x9dacc",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610807806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a71461004e57806375f0bb52146100765780639327136814610089578063ddbdba631461009c575b005b61006161005c3660046103e1565b6100ca565b60405190151581526020015b60405180910390f35b61004c6100843660046104e0565b610101565b61004c6100973660046105d6565b61033c565b6100bc6100aa366004610606565b60006020819052908152604090205481565b60405190815260200161006d565b60006001600160e01b0319821663736bd41d60e11b14806100fb57506001600160e01b031982166301ffc9a760e01b145b92915050565b60008060003390506001816001600160a01b031663affed0e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016d919061061f565b6101779190610638565b9250806001600160a01b031663d8d11f788f8f8f8f8f8f8f8f8f8d6040518b63ffffffff1660e01b81526004016101b79a999897969594939291906106c1565b602060405180830381865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f8919061061f565b91505080336001600160a01b03167fa65fef32cd19a6639a4bf7a6d196f132c151e4f0bbd2706f7f831b3a778e1ac08f8f8f8f8f60008f118a8d8d60405161024899989796959493929190610737565b60405180910390a360008181526020819052604080822084905551633b31d65360e11b81526004810183905273c76eb70e0d56284990ae3f46ffed5c1db3f19a7d91908290637663aca690602401602060405180830381865afa1580156102b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d791906107b4565b90508061032b5760405162461bcd60e51b815260206004820152601c60248201527f456c656374696f6e206e6f7420796574207375636365737366756c2e0000000060448201526064015b60405180910390fd5b505050505050505050505050505050565b600082815260208190526040812054908190036103915760405162461bcd60e51b8152602060048201526013602482015272436f756c64206e6f7420676574206e6f6e636560681b6044820152606401610322565b60008381526020818152604080832092909255905183151581528291859133917f0dcc0fb56a30b6fe6b188f45b47369bc7f3c928a9748e245a79fc3f54ddd0568910160405180910390a4505050565b6000602082840312156103f357600080fd5b81356001600160e01b03198116811461040b57600080fd5b9392505050565b80356001600160a01b038116811461042957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261045557600080fd5b813567ffffffffffffffff808211156104705761047061042e565b604051601f8301601f19908116603f011681019082821181831017156104985761049861042e565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356002811061042957600080fd5b60008060008060008060008060008060006101608c8e03121561050257600080fd5b61050b8c610412565b9a5060208c0135995067ffffffffffffffff8060408e0135111561052e57600080fd5b61053e8e60408f01358f01610444565b995061054c60608e016104d1565b985060808d0135975060a08d0135965060c08d0135955061056f60e08e01610412565b945061057e6101008e01610412565b9350806101208e0135111561059257600080fd5b506105a48d6101208e01358e01610444565b91506105b36101408d01610412565b90509295989b509295989b9093969950565b80151581146105d357600080fd5b50565b600080604083850312156105e957600080fd5b8235915060208301356105fb816105c5565b809150509250929050565b60006020828403121561061857600080fd5b5035919050565b60006020828403121561063157600080fd5b5051919050565b818103818111156100fb57634e487b7160e01b600052601160045260246000fd5b6000815180845260005b8181101561067f57602081850181015186830182015201610663565b506000602082860101526020601f19601f83011685010191505092915050565b600281106106bd57634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038b81168252602082018b9052610140604083018190526000916106ee8483018d610659565b92506106fd606085018c61069f565b60808401999099525060a082019690965260c081019490945291851660e08401529093166101008201526101200191909152949350505050565b6001600160a01b038a81168252602082018a9052610120604083018190526000916107648483018c610659565b9150610773606085018b61069f565b88608085015287151560a08501528660c085015283820360e08501526107998287610659565b925080851661010085015250509a9950505050505050505050565b6000602082840312156107c657600080fd5b815161040b816105c556fea264697066735822122065ddb9b6ddc19b6715eaa56dfb9bfc1c3c92f2fef2035e3c60b67e458bff47b164736f6c63430008100033",
+ "nonce": "0x7",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x774fcc561ccc150c04191058eec0c4c4d7c9f7aadd77300aef43f3dc1e49c677",
+ "transactionIndex": "0x1",
+ "blockHash": "0xfff11b7eef4b32cecdea88c00932243d22f3a5e51290ca0eb02f840f3651fb7c",
+ "blockNumber": "0x8e1dc3",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0x7e729",
+ "gasUsed": "0x79521",
+ "contractAddress": "0xb90FA59dF34D1a2027cCaf6b5c2DD2cb3D60e7bE",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e0a"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688859541,
+ "chain": 5,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ZkBallot.s.sol/100/run-1688860719.json b/election-guard/broadcast/ZkBallot.s.sol/100/run-1688860719.json
new file mode 100644
index 00000000..4830433a
--- /dev/null
+++ b/election-guard/broadcast/ZkBallot.s.sol/100/run-1688860719.json
@@ -0,0 +1,33 @@
+{
+ "transactions": [
+ {
+ "hash": "0x8561e9eb4c7633bde8c9052d42de8487655e35069dcd20d94edcfba999125e6c",
+ "transactionType": "CREATE",
+ "contractName": "ZkBallot",
+ "contractAddress": "0xEce86f082E7f11525886D4c9B6B04b5875DE381e",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0xcd891",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b8152600090819073e249c59f4c5a0dd8b0fe1610e25b4eca3a2fc74a9063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea2646970667358221220e61e06e94f8175fd7936f2b852ba3556f3fca000dd7218f5dbf13e37655c993764736f6c63430008100033",
+ "nonce": "0x1",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [],
+ "libraries": [],
+ "pending": [
+ "0x8561e9eb4c7633bde8c9052d42de8487655e35069dcd20d94edcfba999125e6c"
+ ],
+ "returns": {},
+ "timestamp": 1688860719,
+ "chain": 100,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ZkBallot.s.sol/100/run-1688860725.json b/election-guard/broadcast/ZkBallot.s.sol/100/run-1688860725.json
new file mode 100644
index 00000000..88d53ca2
--- /dev/null
+++ b/election-guard/broadcast/ZkBallot.s.sol/100/run-1688860725.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x8561e9eb4c7633bde8c9052d42de8487655e35069dcd20d94edcfba999125e6c",
+ "transactionType": "CREATE",
+ "contractName": "ZkBallot",
+ "contractAddress": "0xEce86f082E7f11525886D4c9B6B04b5875DE381e",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0xcd891",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b8152600090819073e249c59f4c5a0dd8b0fe1610e25b4eca3a2fc74a9063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea2646970667358221220e61e06e94f8175fd7936f2b852ba3556f3fca000dd7218f5dbf13e37655c993764736f6c63430008100033",
+ "nonce": "0x1",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x8561e9eb4c7633bde8c9052d42de8487655e35069dcd20d94edcfba999125e6c",
+ "transactionIndex": "0x0",
+ "blockHash": "0x22740fcf5363d628cd54b65cb1803fc13420b8768f226c09c6c12c6cfe13a631",
+ "blockNumber": "0x1b84637",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0x9e1ab",
+ "gasUsed": "0x9e1ab",
+ "contractAddress": "0xEce86f082E7f11525886D4c9B6B04b5875DE381e",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e07"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688860725,
+ "chain": 100,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ZkBallot.s.sol/100/run-latest.json b/election-guard/broadcast/ZkBallot.s.sol/100/run-latest.json
new file mode 100644
index 00000000..88d53ca2
--- /dev/null
+++ b/election-guard/broadcast/ZkBallot.s.sol/100/run-latest.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x8561e9eb4c7633bde8c9052d42de8487655e35069dcd20d94edcfba999125e6c",
+ "transactionType": "CREATE",
+ "contractName": "ZkBallot",
+ "contractAddress": "0xEce86f082E7f11525886D4c9B6B04b5875DE381e",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0xcd891",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b8152600090819073e249c59f4c5a0dd8b0fe1610e25b4eca3a2fc74a9063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea2646970667358221220e61e06e94f8175fd7936f2b852ba3556f3fca000dd7218f5dbf13e37655c993764736f6c63430008100033",
+ "nonce": "0x1",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x8561e9eb4c7633bde8c9052d42de8487655e35069dcd20d94edcfba999125e6c",
+ "transactionIndex": "0x0",
+ "blockHash": "0x22740fcf5363d628cd54b65cb1803fc13420b8768f226c09c6c12c6cfe13a631",
+ "blockNumber": "0x1b84637",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0x9e1ab",
+ "gasUsed": "0x9e1ab",
+ "contractAddress": "0xEce86f082E7f11525886D4c9B6B04b5875DE381e",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e07"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688860725,
+ "chain": 100,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ZkBallot.s.sol/5/run-1688857738.json b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688857738.json
new file mode 100644
index 00000000..277b6533
--- /dev/null
+++ b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688857738.json
@@ -0,0 +1,33 @@
+{
+ "transactions": [
+ {
+ "hash": "0x3a9c82e938e26a71f8539e0475b65920e748e75eda22ce715c2d07042f77026d",
+ "transactionType": "CREATE",
+ "contractName": "ZkBallot",
+ "contractAddress": "0xc035175E22f76756FB06b7d1a9521b3f1F2431BC",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0xcd8a1",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b81526000908190733172a66630be2be7d02f38d53dc038a090b82ea79063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea264697066735822122013ebc4d86d3b83ca47b9aa6d1cc4b3103a1d8dee996ed32520035662ee92727164736f6c63430008100033",
+ "nonce": "0x4",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [],
+ "libraries": [],
+ "pending": [
+ "0x3a9c82e938e26a71f8539e0475b65920e748e75eda22ce715c2d07042f77026d"
+ ],
+ "returns": {},
+ "timestamp": 1688857738,
+ "chain": 5,
+ "multi": false,
+ "commit": "de22031"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ZkBallot.s.sol/5/run-1688857744.json b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688857744.json
new file mode 100644
index 00000000..3f073bc9
--- /dev/null
+++ b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688857744.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x3a9c82e938e26a71f8539e0475b65920e748e75eda22ce715c2d07042f77026d",
+ "transactionType": "CREATE",
+ "contractName": "ZkBallot",
+ "contractAddress": "0xc035175E22f76756FB06b7d1a9521b3f1F2431BC",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0xcd8a1",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b81526000908190733172a66630be2be7d02f38d53dc038a090b82ea79063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea264697066735822122013ebc4d86d3b83ca47b9aa6d1cc4b3103a1d8dee996ed32520035662ee92727164736f6c63430008100033",
+ "nonce": "0x4",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x3a9c82e938e26a71f8539e0475b65920e748e75eda22ce715c2d07042f77026d",
+ "transactionIndex": "0x1",
+ "blockHash": "0xe4eaca30a257f71096fd0fb039c1e268a24a27a7eff7064d7ba95cbc0874a034",
+ "blockNumber": "0x8e1d46",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0xa346f",
+ "gasUsed": "0x9e267",
+ "contractAddress": "0xc035175E22f76756FB06b7d1a9521b3f1F2431BC",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e09"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688857744,
+ "chain": 5,
+ "multi": false,
+ "commit": "de22031"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ZkBallot.s.sol/5/run-1688857745.json b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688857745.json
new file mode 100644
index 00000000..ca18cba9
--- /dev/null
+++ b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688857745.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x3a9c82e938e26a71f8539e0475b65920e748e75eda22ce715c2d07042f77026d",
+ "transactionType": "CREATE",
+ "contractName": "ZkBallot",
+ "contractAddress": "0xc035175E22f76756FB06b7d1a9521b3f1F2431BC",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0xcd8a1",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b81526000908190733172a66630be2be7d02f38d53dc038a090b82ea79063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea264697066735822122013ebc4d86d3b83ca47b9aa6d1cc4b3103a1d8dee996ed32520035662ee92727164736f6c63430008100033",
+ "nonce": "0x4",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x3a9c82e938e26a71f8539e0475b65920e748e75eda22ce715c2d07042f77026d",
+ "transactionIndex": "0x1",
+ "blockHash": "0xe4eaca30a257f71096fd0fb039c1e268a24a27a7eff7064d7ba95cbc0874a034",
+ "blockNumber": "0x8e1d46",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0xa346f",
+ "gasUsed": "0x9e267",
+ "contractAddress": "0xc035175E22f76756FB06b7d1a9521b3f1F2431BC",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e09"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688857745,
+ "chain": 5,
+ "multi": false,
+ "commit": "de22031"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ZkBallot.s.sol/5/run-1688859458.json b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688859458.json
new file mode 100644
index 00000000..10dcac1c
--- /dev/null
+++ b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688859458.json
@@ -0,0 +1,33 @@
+{
+ "transactions": [
+ {
+ "hash": "0x640164d1baaae1479ef03535f1e194fb6549a269460bf2fd867ad0a1ad9e952e",
+ "transactionType": "CREATE",
+ "contractName": "ZkBallot",
+ "contractAddress": "0xC76eb70E0d56284990aE3F46FfED5c1Db3f19A7D",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0xcd891",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b8152600090819073e249c59f4c5a0dd8b0fe1610e25b4eca3a2fc74a9063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea2646970667358221220e61e06e94f8175fd7936f2b852ba3556f3fca000dd7218f5dbf13e37655c993764736f6c63430008100033",
+ "nonce": "0x6",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [],
+ "libraries": [],
+ "pending": [
+ "0x640164d1baaae1479ef03535f1e194fb6549a269460bf2fd867ad0a1ad9e952e"
+ ],
+ "returns": {},
+ "timestamp": 1688859458,
+ "chain": 5,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ZkBallot.s.sol/5/run-1688859470.json b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688859470.json
new file mode 100644
index 00000000..308d67cb
--- /dev/null
+++ b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688859470.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x640164d1baaae1479ef03535f1e194fb6549a269460bf2fd867ad0a1ad9e952e",
+ "transactionType": "CREATE",
+ "contractName": "ZkBallot",
+ "contractAddress": "0xC76eb70E0d56284990aE3F46FfED5c1Db3f19A7D",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0xcd891",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b8152600090819073e249c59f4c5a0dd8b0fe1610e25b4eca3a2fc74a9063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea2646970667358221220e61e06e94f8175fd7936f2b852ba3556f3fca000dd7218f5dbf13e37655c993764736f6c63430008100033",
+ "nonce": "0x6",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x640164d1baaae1479ef03535f1e194fb6549a269460bf2fd867ad0a1ad9e952e",
+ "transactionIndex": "0x3",
+ "blockHash": "0xc99438c4e93dd16d219af49ebed4b5fbd510e7499777df23bd4f6c122ef5c9fd",
+ "blockNumber": "0x8e1dbd",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0x11cf2c",
+ "gasUsed": "0x9e25b",
+ "contractAddress": "0xC76eb70E0d56284990aE3F46FfED5c1Db3f19A7D",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e0d"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688859470,
+ "chain": 5,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ZkBallot.s.sol/5/run-1688860589.json b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688860589.json
new file mode 100644
index 00000000..89d92ccc
--- /dev/null
+++ b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688860589.json
@@ -0,0 +1,33 @@
+{
+ "transactions": [
+ {
+ "hash": "0x4ccacbfba9294aadc2e91e35e79dd861649e9f06079b5af3f0b94c86e5944c87",
+ "transactionType": "CREATE",
+ "contractName": "ZkBallot",
+ "contractAddress": "0x30b3ec90F886BC6dC888E1695342e58A499fa250",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0xcd891",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b8152600090819073e249c59f4c5a0dd8b0fe1610e25b4eca3a2fc74a9063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea2646970667358221220e61e06e94f8175fd7936f2b852ba3556f3fca000dd7218f5dbf13e37655c993764736f6c63430008100033",
+ "nonce": "0x8",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [],
+ "libraries": [],
+ "pending": [
+ "0x4ccacbfba9294aadc2e91e35e79dd861649e9f06079b5af3f0b94c86e5944c87"
+ ],
+ "returns": {},
+ "timestamp": 1688860589,
+ "chain": 5,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ZkBallot.s.sol/5/run-1688860613.json b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688860613.json
new file mode 100644
index 00000000..0c74a80c
--- /dev/null
+++ b/election-guard/broadcast/ZkBallot.s.sol/5/run-1688860613.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x4ccacbfba9294aadc2e91e35e79dd861649e9f06079b5af3f0b94c86e5944c87",
+ "transactionType": "CREATE",
+ "contractName": "ZkBallot",
+ "contractAddress": "0x30b3ec90F886BC6dC888E1695342e58A499fa250",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0xcd891",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b8152600090819073e249c59f4c5a0dd8b0fe1610e25b4eca3a2fc74a9063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea2646970667358221220e61e06e94f8175fd7936f2b852ba3556f3fca000dd7218f5dbf13e37655c993764736f6c63430008100033",
+ "nonce": "0x8",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x4ccacbfba9294aadc2e91e35e79dd861649e9f06079b5af3f0b94c86e5944c87",
+ "transactionIndex": "0xb",
+ "blockHash": "0x60926e4131d6fcba4005c770ba9b14f6e19bfe370d5d44e64479d58520107090",
+ "blockNumber": "0x8e1e0c",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0x1e9f7a",
+ "gasUsed": "0x9e25b",
+ "contractAddress": "0x30b3ec90F886BC6dC888E1695342e58A499fa250",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e0a"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688860613,
+ "chain": 5,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/broadcast/ZkBallot.s.sol/5/run-latest.json b/election-guard/broadcast/ZkBallot.s.sol/5/run-latest.json
new file mode 100644
index 00000000..0c74a80c
--- /dev/null
+++ b/election-guard/broadcast/ZkBallot.s.sol/5/run-latest.json
@@ -0,0 +1,48 @@
+{
+ "transactions": [
+ {
+ "hash": "0x4ccacbfba9294aadc2e91e35e79dd861649e9f06079b5af3f0b94c86e5944c87",
+ "transactionType": "CREATE",
+ "contractName": "ZkBallot",
+ "contractAddress": "0x30b3ec90F886BC6dC888E1695342e58A499fa250",
+ "function": null,
+ "arguments": null,
+ "transaction": {
+ "type": "0x02",
+ "from": "0x7deeb2030ce240cafd087d182443cdc53f21f2c6",
+ "gas": "0xcd891",
+ "value": "0x0",
+ "data": "0x608060405234801561001057600080fd5b50610ac2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637349746b1161005b5780637349746b146101105780637663aca614610142578063bbcb7c7414610155578063fd7f643d1461016857600080fd5b806305ab39b71461008d57806309a5bbee146100ba5780631257fb7d146100e8578063509b0826146100fd575b600080fd5b6100a061009b36600461063e565b6101ce565b6040516100b1959493929190610657565b60405180910390f35b6100da6100c836600461063e565b60026020526000908152604090205481565b6040519081526020016100b1565b6100fb6100f6366004610716565b61028e565b005b6100fb61010b3660046107b0565b610464565b61013261011e36600461063e565b600090815260026020526040902054151590565b60405190151581526020016100b1565b61013261015036600461063e565b61053a565b610132610163366004610716565b6105b1565b6101ad61017636600461063e565b60008181526002602081815260408084205484529083905290912060018101549181015460039091015463ffffffff169193909250565b60408051938452602084019290925263ffffffff16908201526060016100b1565b6000602081905290815260409020805481906101e99061082a565b80601f01602080910402602001604051908101604052809291908181526020018280546102159061082a565b80156102625780601f1061023757610100808354040283529160200191610262565b820191906000526020600020905b81548152906001019060200180831161024557829003601f168201915b5050506001840154600285015460038601546004909601549495919490935063ffffffff909116915085565b600061029c858585856105b1565b9050806102f05760405162461bcd60e51b815260206004820152601860248201527f546869732070726f6f66206973206e6f742076616c69642e000000000000000060448201526064015b60405180910390fd5b60008060008585600181811061030857610308610864565b9050602002013581526020019081526020016000209050600160008585600381811061033657610336610864565b602090810292909201358352508101919091526040016000205460ff16156103aa5760405162461bcd60e51b815260206004820152602160248201527f546869732070726f6f662068617320616c7265616479206265656e20757365646044820152601760f91b60648201526084016102e7565b6001806000868660038181106103c2576103c2610864565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008484600281811061040357610403610864565b9050602002013560001c1161042d5760028101805490600061042483610890565b91905055610444565b60028101805490600061043f836108ad565b919050555b50600181018054906000610457836108cc565b9190505550505050505050565b6040805160c06020601f8901819004028201810190925260a081018781526000928291908a908a908190850183828082843760009201829052509385525050506020808301829052604080840183905263ffffffff8a166060850152608090930186905286825260028152828220889055878252819052208151919250829181906104ef908261093f565b506020820151600182015560408201516002820155606082015160038201805463ffffffff191663ffffffff909216919091179055608090910151600490910155505b505050505050565b6000818152600260209081526040808320548084529183905282206001908101541080159190829061058b57506000818152602081905260409020600381015460019091015463ffffffff90911611155b91508180156105a95750600081815260208190526040812060020154135b949350505050565b604051633a94343960e21b8152600090819073e249c59f4c5a0dd8b0fe1610e25b4eca3a2fc74a9063ea50d0e4906105f39089908990899089906004016109ff565b602060405180830381865afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610a63565b9695505050505050565b60006020828403121561065057600080fd5b5035919050565b60a08152600086518060a084015260005b81811015610685576020818a0181015160c0868401015201610668565b50600060c0828501015260c0601f19601f8301168401019150508560208301528460408301526106bd606083018563ffffffff169052565b8260808301529695505050505050565b60008083601f8401126106df57600080fd5b50813567ffffffffffffffff8111156106f757600080fd5b60208301915083602082850101111561070f57600080fd5b9250929050565b6000806000806040858703121561072c57600080fd5b843567ffffffffffffffff8082111561074457600080fd5b610750888389016106cd565b9096509450602087013591508082111561076957600080fd5b818701915087601f83011261077d57600080fd5b81358181111561078c57600080fd5b8860208260051b85010111156107a157600080fd5b95989497505060200194505050565b60008060008060008060a087890312156107c957600080fd5b863567ffffffffffffffff8111156107e057600080fd5b6107ec89828a016106cd565b909750955050602087013563ffffffff8116811461080957600080fd5b95989497509495604081013595506060810135946080909101359350915050565b600181811c9082168061083e57607f821691505b60208210810361085e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b82016108a5576108a561087a565b506000190190565b60006001600160ff1b0182016108c5576108c561087a565b5060010190565b6000600182016108c5576108c561087a565b634e487b7160e01b600052604160045260246000fd5b601f82111561093a57600081815260208120601f850160051c8101602086101561091b5750805b601f850160051c820191505b8181101561053257828155600101610927565b505050565b815167ffffffffffffffff811115610959576109596108de565b61096d81610967845461082a565b846108f4565b602080601f8311600181146109a2576000841561098a5750858301515b600019600386901b1c1916600185901b178555610532565b600085815260208120601f198616915b828110156109d1578886015182559484019460019091019084016109b2565b50858210156109ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815283604082015283856060830137600060608583018101829052601f19601f8701168301838103820160208501529081018490526001600160fb1b03841115610a4a57600080fd5b8360051b80866080840137016080019695505050505050565b600060208284031215610a7557600080fd5b81518015158114610a8557600080fd5b939250505056fea2646970667358221220e61e06e94f8175fd7936f2b852ba3556f3fca000dd7218f5dbf13e37655c993764736f6c63430008100033",
+ "nonce": "0x8",
+ "accessList": []
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x4ccacbfba9294aadc2e91e35e79dd861649e9f06079b5af3f0b94c86e5944c87",
+ "transactionIndex": "0xb",
+ "blockHash": "0x60926e4131d6fcba4005c770ba9b14f6e19bfe370d5d44e64479d58520107090",
+ "blockNumber": "0x8e1e0c",
+ "from": "0x7DEeb2030CE240caFd087d182443Cdc53f21F2c6",
+ "to": null,
+ "cumulativeGasUsed": "0x1e9f7a",
+ "gasUsed": "0x9e25b",
+ "contractAddress": "0x30b3ec90F886BC6dC888E1695342e58A499fa250",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "effectiveGasPrice": "0xb2d05e0a"
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1688860613,
+ "chain": 5,
+ "multi": false,
+ "commit": "44d1ac6"
+}
\ No newline at end of file
diff --git a/election-guard/foundry.toml b/election-guard/foundry.toml
new file mode 100644
index 00000000..782dd151
--- /dev/null
+++ b/election-guard/foundry.toml
@@ -0,0 +1,7 @@
+[profile.default]
+src = "src"
+out = "out"
+libs = ["lib"]
+compiler-version = "0.8.13"
+
+# See more config options https://github.com/foundry-rs/foundry/tree/master/config
diff --git a/election-guard/lib/forge-std/.github/workflows/ci.yml b/election-guard/lib/forge-std/.github/workflows/ci.yml
new file mode 100644
index 00000000..96b23365
--- /dev/null
+++ b/election-guard/lib/forge-std/.github/workflows/ci.yml
@@ -0,0 +1,92 @@
+name: CI
+
+on:
+ workflow_dispatch:
+ pull_request:
+ push:
+ branches:
+ - master
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Install Foundry
+ uses: onbjerg/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Print forge version
+ run: forge --version
+
+ # Backwards compatibility checks.
+ - name: Check compatibility with 0.8.0
+ if: always()
+ run: forge build --skip test --use solc:0.8.0
+
+ - name: Check compatibility with 0.7.6
+ if: always()
+ run: forge build --skip test --use solc:0.7.6
+
+ - name: Check compatibility with 0.7.0
+ if: always()
+ run: forge build --skip test --use solc:0.7.0
+
+ - name: Check compatibility with 0.6.12
+ if: always()
+ run: forge build --skip test --use solc:0.6.12
+
+ - name: Check compatibility with 0.6.2
+ if: always()
+ run: forge build --skip test --use solc:0.6.2
+
+ # via-ir compilation time checks.
+ - name: Measure compilation time of Test with 0.8.17 --via-ir
+ if: always()
+ run: forge build --skip test --contracts test/compilation/CompilationTest.sol --use solc:0.8.17 --via-ir
+
+ - name: Measure compilation time of TestBase with 0.8.17 --via-ir
+ if: always()
+ run: forge build --skip test --contracts test/compilation/CompilationTestBase.sol --use solc:0.8.17 --via-ir
+
+ - name: Measure compilation time of Script with 0.8.17 --via-ir
+ if: always()
+ run: forge build --skip test --contracts test/compilation/CompilationScript.sol --use solc:0.8.17 --via-ir
+
+ - name: Measure compilation time of ScriptBase with 0.8.17 --via-ir
+ if: always()
+ run: forge build --skip test --contracts test/compilation/CompilationScriptBase.sol --use solc:0.8.17 --via-ir
+
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Install Foundry
+ uses: onbjerg/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Print forge version
+ run: forge --version
+
+ - name: Run tests
+ run: forge test -vvv
+
+ fmt:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Install Foundry
+ uses: onbjerg/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Print forge version
+ run: forge --version
+
+ - name: Check formatting
+ run: forge fmt --check
diff --git a/election-guard/lib/forge-std/.github/workflows/sync.yml b/election-guard/lib/forge-std/.github/workflows/sync.yml
new file mode 100644
index 00000000..5a9e9d59
--- /dev/null
+++ b/election-guard/lib/forge-std/.github/workflows/sync.yml
@@ -0,0 +1,29 @@
+name: Sync Release Branch
+
+on:
+ release:
+ types:
+ - created
+
+jobs:
+ sync-release-branch:
+ runs-on: ubuntu-latest
+ if: startsWith(github.event.release.tag_name, 'v1')
+ steps:
+ - name: Check out the repo
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ ref: v1
+
+ - name: Configure Git
+ run: |
+ git config user.name github-actions[bot]
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
+
+ - name: Sync Release Branch
+ run: |
+ git fetch --tags
+ git checkout v1
+ git reset --hard ${GITHUB_REF}
+ git push --force
diff --git a/election-guard/lib/forge-std/.gitignore b/election-guard/lib/forge-std/.gitignore
new file mode 100644
index 00000000..756106d3
--- /dev/null
+++ b/election-guard/lib/forge-std/.gitignore
@@ -0,0 +1,4 @@
+cache/
+out/
+.vscode
+.idea
diff --git a/election-guard/lib/forge-std/.gitmodules b/election-guard/lib/forge-std/.gitmodules
new file mode 100644
index 00000000..e1247196
--- /dev/null
+++ b/election-guard/lib/forge-std/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "lib/ds-test"]
+ path = lib/ds-test
+ url = https://github.com/dapphub/ds-test
diff --git a/election-guard/lib/forge-std/LICENSE-APACHE b/election-guard/lib/forge-std/LICENSE-APACHE
new file mode 100644
index 00000000..cf01a499
--- /dev/null
+++ b/election-guard/lib/forge-std/LICENSE-APACHE
@@ -0,0 +1,203 @@
+Copyright Contributors to Forge Standard Library
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/election-guard/lib/forge-std/LICENSE-MIT b/election-guard/lib/forge-std/LICENSE-MIT
new file mode 100644
index 00000000..28f98304
--- /dev/null
+++ b/election-guard/lib/forge-std/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright Contributors to Forge Standard Library
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE O THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.R
diff --git a/election-guard/lib/forge-std/README.md b/election-guard/lib/forge-std/README.md
new file mode 100644
index 00000000..8494a7dd
--- /dev/null
+++ b/election-guard/lib/forge-std/README.md
@@ -0,0 +1,250 @@
+# Forge Standard Library • [](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml)
+
+Forge Standard Library is a collection of helpful contracts and libraries for use with [Forge and Foundry](https://github.com/foundry-rs/foundry). It leverages Forge's cheatcodes to make writing tests easier and faster, while improving the UX of cheatcodes.
+
+**Learn how to use Forge-Std with the [📖 Foundry Book (Forge-Std Guide)](https://book.getfoundry.sh/forge/forge-std.html).**
+
+## Install
+
+```bash
+forge install foundry-rs/forge-std
+```
+
+## Contracts
+### stdError
+
+This is a helper contract for errors and reverts. In Forge, this contract is particularly helpful for the `expectRevert` cheatcode, as it provides all compiler builtin errors.
+
+See the contract itself for all error codes.
+
+#### Example usage
+
+```solidity
+
+import "forge-std/Test.sol";
+
+contract TestContract is Test {
+ ErrorsTest test;
+
+ function setUp() public {
+ test = new ErrorsTest();
+ }
+
+ function testExpectArithmetic() public {
+ vm.expectRevert(stdError.arithmeticError);
+ test.arithmeticError(10);
+ }
+}
+
+contract ErrorsTest {
+ function arithmeticError(uint256 a) public {
+ uint256 a = a - 100;
+ }
+}
+```
+
+### stdStorage
+
+This is a rather large contract due to all of the overloading to make the UX decent. Primarily, it is a wrapper around the `record` and `accesses` cheatcodes. It can *always* find and write the storage slot(s) associated with a particular variable without knowing the storage layout. The one _major_ caveat to this is while a slot can be found for packed storage variables, we can't write to that variable safely. If a user tries to write to a packed slot, the execution throws an error, unless it is uninitialized (`bytes32(0)`).
+
+This works by recording all `SLOAD`s and `SSTORE`s during a function call. If there is a single slot read or written to, it immediately returns the slot. Otherwise, behind the scenes, we iterate through and check each one (assuming the user passed in a `depth` parameter). If the variable is a struct, you can pass in a `depth` parameter which is basically the field depth.
+
+I.e.:
+```solidity
+struct T {
+ // depth 0
+ uint256 a;
+ // depth 1
+ uint256 b;
+}
+```
+
+#### Example usage
+
+```solidity
+import "forge-std/Test.sol";
+
+contract TestContract is Test {
+ using stdStorage for StdStorage;
+
+ Storage test;
+
+ function setUp() public {
+ test = new Storage();
+ }
+
+ function testFindExists() public {
+ // Lets say we want to find the slot for the public
+ // variable `exists`. We just pass in the function selector
+ // to the `find` command
+ uint256 slot = stdstore.target(address(test)).sig("exists()").find();
+ assertEq(slot, 0);
+ }
+
+ function testWriteExists() public {
+ // Lets say we want to write to the slot for the public
+ // variable `exists`. We just pass in the function selector
+ // to the `checked_write` command
+ stdstore.target(address(test)).sig("exists()").checked_write(100);
+ assertEq(test.exists(), 100);
+ }
+
+ // It supports arbitrary storage layouts, like assembly based storage locations
+ function testFindHidden() public {
+ // `hidden` is a random hash of a bytes, iteration through slots would
+ // not find it. Our mechanism does
+ // Also, you can use the selector instead of a string
+ uint256 slot = stdstore.target(address(test)).sig(test.hidden.selector).find();
+ assertEq(slot, uint256(keccak256("my.random.var")));
+ }
+
+ // If targeting a mapping, you have to pass in the keys necessary to perform the find
+ // i.e.:
+ function testFindMapping() public {
+ uint256 slot = stdstore
+ .target(address(test))
+ .sig(test.map_addr.selector)
+ .with_key(address(this))
+ .find();
+ // in the `Storage` constructor, we wrote that this address' value was 1 in the map
+ // so when we load the slot, we expect it to be 1
+ assertEq(uint(vm.load(address(test), bytes32(slot))), 1);
+ }
+
+ // If the target is a struct, you can specify the field depth:
+ function testFindStruct() public {
+ // NOTE: see the depth parameter - 0 means 0th field, 1 means 1st field, etc.
+ uint256 slot_for_a_field = stdstore
+ .target(address(test))
+ .sig(test.basicStruct.selector)
+ .depth(0)
+ .find();
+
+ uint256 slot_for_b_field = stdstore
+ .target(address(test))
+ .sig(test.basicStruct.selector)
+ .depth(1)
+ .find();
+
+ assertEq(uint(vm.load(address(test), bytes32(slot_for_a_field))), 1);
+ assertEq(uint(vm.load(address(test), bytes32(slot_for_b_field))), 2);
+ }
+}
+
+// A complex storage contract
+contract Storage {
+ struct UnpackedStruct {
+ uint256 a;
+ uint256 b;
+ }
+
+ constructor() {
+ map_addr[msg.sender] = 1;
+ }
+
+ uint256 public exists = 1;
+ mapping(address => uint256) public map_addr;
+ // mapping(address => Packed) public map_packed;
+ mapping(address => UnpackedStruct) public map_struct;
+ mapping(address => mapping(address => uint256)) public deep_map;
+ mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct;
+ UnpackedStruct public basicStruct = UnpackedStruct({
+ a: 1,
+ b: 2
+ });
+
+ function hidden() public view returns (bytes32 t) {
+ // an extremely hidden storage slot
+ bytes32 slot = keccak256("my.random.var");
+ assembly {
+ t := sload(slot)
+ }
+ }
+}
+```
+
+### stdCheats
+
+This is a wrapper over miscellaneous cheatcodes that need wrappers to be more dev friendly. Currently there are only functions related to `prank`. In general, users may expect ETH to be put into an address on `prank`, but this is not the case for safety reasons. Explicitly this `hoax` function should only be used for address that have expected balances as it will get overwritten. If an address already has ETH, you should just use `prank`. If you want to change that balance explicitly, just use `deal`. If you want to do both, `hoax` is also right for you.
+
+
+#### Example usage:
+```solidity
+
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import "forge-std/Test.sol";
+
+// Inherit the stdCheats
+contract StdCheatsTest is Test {
+ Bar test;
+ function setUp() public {
+ test = new Bar();
+ }
+
+ function testHoax() public {
+ // we call `hoax`, which gives the target address
+ // eth and then calls `prank`
+ hoax(address(1337));
+ test.bar{value: 100}(address(1337));
+
+ // overloaded to allow you to specify how much eth to
+ // initialize the address with
+ hoax(address(1337), 1);
+ test.bar{value: 1}(address(1337));
+ }
+
+ function testStartHoax() public {
+ // we call `startHoax`, which gives the target address
+ // eth and then calls `startPrank`
+ //
+ // it is also overloaded so that you can specify an eth amount
+ startHoax(address(1337));
+ test.bar{value: 100}(address(1337));
+ test.bar{value: 100}(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+}
+
+contract Bar {
+ function bar(address expectedSender) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ }
+}
+```
+
+### Std Assertions
+
+Expand upon the assertion functions from the `DSTest` library.
+
+### `console.log`
+
+Usage follows the same format as [Hardhat](https://hardhat.org/hardhat-network/reference/#console-log).
+It's recommended to use `console2.sol` as shown below, as this will show the decoded logs in Forge traces.
+
+```solidity
+// import it indirectly via Test.sol
+import "forge-std/Test.sol";
+// or directly import it
+import "forge-std/console2.sol";
+...
+console2.log(someValue);
+```
+
+If you need compatibility with Hardhat, you must use the standard `console.sol` instead.
+Due to a bug in `console.sol`, logs that use `uint256` or `int256` types will not be properly decoded in Forge traces.
+
+```solidity
+// import it indirectly via Test.sol
+import "forge-std/Test.sol";
+// or directly import it
+import "forge-std/console.sol";
+...
+console.log(someValue);
+```
+
+## License
+
+Forge Standard Library is offered under either [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) license.
diff --git a/election-guard/lib/forge-std/foundry.toml b/election-guard/lib/forge-std/foundry.toml
new file mode 100644
index 00000000..f9679ee6
--- /dev/null
+++ b/election-guard/lib/forge-std/foundry.toml
@@ -0,0 +1,21 @@
+[profile.default]
+fs_permissions = [{ access = "read-write", path = "./"}]
+
+[rpc_endpoints]
+# The RPC URLs are modified versions of the default for testing initialization.
+mainnet = "https://mainnet.infura.io/v3/b1d3925804e74152b316ca7da97060d3" # Different API key.
+optimism_goerli = "https://goerli.optimism.io/" # Adds a trailing slash.
+arbitrum_one_goerli = "https://goerli-rollup.arbitrum.io/rpc/" # Adds a trailing slash.
+needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}"
+
+[fmt]
+# These are all the `forge fmt` defaults.
+line_length = 120
+tab_width = 4
+bracket_spacing = false
+int_types = 'long'
+multiline_func_header = 'attributes_first'
+quote_style = 'double'
+number_underscore = 'preserve'
+single_line_statement_blocks = 'preserve'
+ignore = ["src/console.sol", "src/console2.sol"]
\ No newline at end of file
diff --git a/election-guard/lib/forge-std/lib/ds-test/.github/workflows/build.yml b/election-guard/lib/forge-std/lib/ds-test/.github/workflows/build.yml
new file mode 100644
index 00000000..d2ff97db
--- /dev/null
+++ b/election-guard/lib/forge-std/lib/ds-test/.github/workflows/build.yml
@@ -0,0 +1,41 @@
+name: "Build"
+on:
+ pull_request:
+ push:
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: cachix/install-nix-action@v20
+ with:
+ nix_path: nixpkgs=channel:nixos-unstable
+ extra_nix_config: |
+ access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
+
+ - name: setup dapp binary cache
+ uses: cachix/cachix-action@v12
+ with:
+ name: dapp
+
+ - name: install dapptools
+ run: nix profile install github:dapphub/dapptools#dapp --accept-flake-config
+
+ - name: install foundry
+ uses: foundry-rs/foundry-toolchain@v1
+
+ - name: test with solc-0.5.17
+ run: dapp --use solc-0.5.17 test -v
+
+ - name: test with solc-0.6.11
+ run: dapp --use solc-0.6.11 test -v
+
+ - name: test with solc-0.7.6
+ run: dapp --use solc-0.7.6 test -v
+
+ - name: test with solc-0.8.18
+ run: dapp --use solc-0.8.18 test -v
+
+ - name: Run tests with foundry
+ run: forge test -vvv
+
diff --git a/election-guard/lib/forge-std/lib/ds-test/.gitignore b/election-guard/lib/forge-std/lib/ds-test/.gitignore
new file mode 100644
index 00000000..462a9949
--- /dev/null
+++ b/election-guard/lib/forge-std/lib/ds-test/.gitignore
@@ -0,0 +1,4 @@
+/.dapple
+/build
+/out
+/cache/
diff --git a/election-guard/lib/forge-std/lib/ds-test/LICENSE b/election-guard/lib/forge-std/lib/ds-test/LICENSE
new file mode 100644
index 00000000..94a9ed02
--- /dev/null
+++ b/election-guard/lib/forge-std/lib/ds-test/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/election-guard/lib/forge-std/lib/ds-test/Makefile b/election-guard/lib/forge-std/lib/ds-test/Makefile
new file mode 100644
index 00000000..661dac48
--- /dev/null
+++ b/election-guard/lib/forge-std/lib/ds-test/Makefile
@@ -0,0 +1,14 @@
+all:; dapp build
+
+test:
+ -dapp --use solc:0.4.23 build
+ -dapp --use solc:0.4.26 build
+ -dapp --use solc:0.5.17 build
+ -dapp --use solc:0.6.12 build
+ -dapp --use solc:0.7.5 build
+
+demo:
+ DAPP_SRC=demo dapp --use solc:0.7.5 build
+ -hevm dapp-test --verbose 3
+
+.PHONY: test demo
diff --git a/election-guard/lib/forge-std/lib/ds-test/default.nix b/election-guard/lib/forge-std/lib/ds-test/default.nix
new file mode 100644
index 00000000..cf65419a
--- /dev/null
+++ b/election-guard/lib/forge-std/lib/ds-test/default.nix
@@ -0,0 +1,4 @@
+{ solidityPackage, dappsys }: solidityPackage {
+ name = "ds-test";
+ src = ./src;
+}
diff --git a/election-guard/lib/forge-std/lib/ds-test/demo/demo.sol b/election-guard/lib/forge-std/lib/ds-test/demo/demo.sol
new file mode 100644
index 00000000..f3bb48e7
--- /dev/null
+++ b/election-guard/lib/forge-std/lib/ds-test/demo/demo.sol
@@ -0,0 +1,222 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+pragma solidity >=0.5.0;
+
+import "../src/test.sol";
+
+contract DemoTest is DSTest {
+ function test_this() public pure {
+ require(true);
+ }
+ function test_logs() public {
+ emit log("-- log(string)");
+ emit log("a string");
+
+ emit log("-- log_named_uint(string, uint)");
+ emit log_named_uint("uint", 512);
+
+ emit log("-- log_named_int(string, int)");
+ emit log_named_int("int", -512);
+
+ emit log("-- log_named_address(string, address)");
+ emit log_named_address("address", address(this));
+
+ emit log("-- log_named_bytes32(string, bytes32)");
+ emit log_named_bytes32("bytes32", "a string");
+
+ emit log("-- log_named_bytes(string, bytes)");
+ emit log_named_bytes("bytes", hex"cafefe");
+
+ emit log("-- log_named_string(string, string)");
+ emit log_named_string("string", "a string");
+
+ emit log("-- log_named_decimal_uint(string, uint, uint)");
+ emit log_named_decimal_uint("decimal uint", 1.0e18, 18);
+
+ emit log("-- log_named_decimal_int(string, int, uint)");
+ emit log_named_decimal_int("decimal int", -1.0e18, 18);
+ }
+ event log_old_named_uint(bytes32,uint);
+ function test_old_logs() public {
+ emit log_old_named_uint("key", 500);
+ emit log_named_bytes32("bkey", "val");
+ }
+ function test_trace() public view {
+ this.echo("string 1", "string 2");
+ }
+ function test_multiline() public {
+ emit log("a multiline\\nstring");
+ emit log("a multiline string");
+ emit log_bytes("a string");
+ emit log_bytes("a multiline\nstring");
+ emit log_bytes("a multiline\\nstring");
+ emit logs(hex"0000");
+ emit log_named_bytes("0x0000", hex"0000");
+ emit logs(hex"ff");
+ }
+ function echo(string memory s1, string memory s2) public pure
+ returns (string memory, string memory)
+ {
+ return (s1, s2);
+ }
+
+ function prove_this(uint x) public {
+ emit log_named_uint("sym x", x);
+ assertGt(x + 1, 0);
+ }
+
+ function test_logn() public {
+ assembly {
+ log0(0x01, 0x02)
+ log1(0x01, 0x02, 0x03)
+ log2(0x01, 0x02, 0x03, 0x04)
+ log3(0x01, 0x02, 0x03, 0x04, 0x05)
+ }
+ }
+
+ event MyEvent(uint, uint indexed, uint, uint indexed);
+ function test_events() public {
+ emit MyEvent(1, 2, 3, 4);
+ }
+
+ function test_asserts() public {
+ string memory err = "this test has failed!";
+ emit log("## assertTrue(bool)\n");
+ assertTrue(false);
+ emit log("\n");
+ assertTrue(false, err);
+
+ emit log("\n## assertEq(address,address)\n");
+ assertEq(address(this), msg.sender);
+ emit log("\n");
+ assertEq(address(this), msg.sender, err);
+
+ emit log("\n## assertEq32(bytes32,bytes32)\n");
+ assertEq32("bytes 1", "bytes 2");
+ emit log("\n");
+ assertEq32("bytes 1", "bytes 2", err);
+
+ emit log("\n## assertEq(bytes32,bytes32)\n");
+ assertEq32("bytes 1", "bytes 2");
+ emit log("\n");
+ assertEq32("bytes 1", "bytes 2", err);
+
+ emit log("\n## assertEq(uint,uint)\n");
+ assertEq(uint(0), 1);
+ emit log("\n");
+ assertEq(uint(0), 1, err);
+
+ emit log("\n## assertEq(int,int)\n");
+ assertEq(-1, -2);
+ emit log("\n");
+ assertEq(-1, -2, err);
+
+ emit log("\n## assertEqDecimal(int,int,uint)\n");
+ assertEqDecimal(-1.0e18, -1.1e18, 18);
+ emit log("\n");
+ assertEqDecimal(-1.0e18, -1.1e18, 18, err);
+
+ emit log("\n## assertEqDecimal(uint,uint,uint)\n");
+ assertEqDecimal(uint(1.0e18), 1.1e18, 18);
+ emit log("\n");
+ assertEqDecimal(uint(1.0e18), 1.1e18, 18, err);
+
+ emit log("\n## assertGt(uint,uint)\n");
+ assertGt(uint(0), 0);
+ emit log("\n");
+ assertGt(uint(0), 0, err);
+
+ emit log("\n## assertGt(int,int)\n");
+ assertGt(-1, -1);
+ emit log("\n");
+ assertGt(-1, -1, err);
+
+ emit log("\n## assertGtDecimal(int,int,uint)\n");
+ assertGtDecimal(-2.0e18, -1.1e18, 18);
+ emit log("\n");
+ assertGtDecimal(-2.0e18, -1.1e18, 18, err);
+
+ emit log("\n## assertGtDecimal(uint,uint,uint)\n");
+ assertGtDecimal(uint(1.0e18), 1.1e18, 18);
+ emit log("\n");
+ assertGtDecimal(uint(1.0e18), 1.1e18, 18, err);
+
+ emit log("\n## assertGe(uint,uint)\n");
+ assertGe(uint(0), 1);
+ emit log("\n");
+ assertGe(uint(0), 1, err);
+
+ emit log("\n## assertGe(int,int)\n");
+ assertGe(-1, 0);
+ emit log("\n");
+ assertGe(-1, 0, err);
+
+ emit log("\n## assertGeDecimal(int,int,uint)\n");
+ assertGeDecimal(-2.0e18, -1.1e18, 18);
+ emit log("\n");
+ assertGeDecimal(-2.0e18, -1.1e18, 18, err);
+
+ emit log("\n## assertGeDecimal(uint,uint,uint)\n");
+ assertGeDecimal(uint(1.0e18), 1.1e18, 18);
+ emit log("\n");
+ assertGeDecimal(uint(1.0e18), 1.1e18, 18, err);
+
+ emit log("\n## assertLt(uint,uint)\n");
+ assertLt(uint(0), 0);
+ emit log("\n");
+ assertLt(uint(0), 0, err);
+
+ emit log("\n## assertLt(int,int)\n");
+ assertLt(-1, -1);
+ emit log("\n");
+ assertLt(-1, -1, err);
+
+ emit log("\n## assertLtDecimal(int,int,uint)\n");
+ assertLtDecimal(-1.0e18, -1.1e18, 18);
+ emit log("\n");
+ assertLtDecimal(-1.0e18, -1.1e18, 18, err);
+
+ emit log("\n## assertLtDecimal(uint,uint,uint)\n");
+ assertLtDecimal(uint(2.0e18), 1.1e18, 18);
+ emit log("\n");
+ assertLtDecimal(uint(2.0e18), 1.1e18, 18, err);
+
+ emit log("\n## assertLe(uint,uint)\n");
+ assertLe(uint(1), 0);
+ emit log("\n");
+ assertLe(uint(1), 0, err);
+
+ emit log("\n## assertLe(int,int)\n");
+ assertLe(0, -1);
+ emit log("\n");
+ assertLe(0, -1, err);
+
+ emit log("\n## assertLeDecimal(int,int,uint)\n");
+ assertLeDecimal(-1.0e18, -1.1e18, 18);
+ emit log("\n");
+ assertLeDecimal(-1.0e18, -1.1e18, 18, err);
+
+ emit log("\n## assertLeDecimal(uint,uint,uint)\n");
+ assertLeDecimal(uint(2.0e18), 1.1e18, 18);
+ emit log("\n");
+ assertLeDecimal(uint(2.0e18), 1.1e18, 18, err);
+
+ emit log("\n## assertEq(string,string)\n");
+ string memory s1 = "string 1";
+ string memory s2 = "string 2";
+ assertEq(s1, s2);
+ emit log("\n");
+ assertEq(s1, s2, err);
+
+ emit log("\n## assertEq0(bytes,bytes)\n");
+ assertEq0(hex"abcdef01", hex"abcdef02");
+ emit log("\n");
+ assertEq0(hex"abcdef01", hex"abcdef02", err);
+ }
+}
+
+contract DemoTestWithSetUp {
+ function setUp() public {
+ }
+ function test_pass() public pure {
+ }
+}
diff --git a/election-guard/lib/forge-std/lib/ds-test/package.json b/election-guard/lib/forge-std/lib/ds-test/package.json
new file mode 100644
index 00000000..4802adaa
--- /dev/null
+++ b/election-guard/lib/forge-std/lib/ds-test/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "ds-test",
+ "version": "1.0.0",
+ "description": "Assertions, equality checks and other test helpers ",
+ "bugs": "https://github.com/dapphub/ds-test/issues",
+ "license": "GPL-3.0",
+ "author": "Contributors to ds-test",
+ "files": [
+ "src/*"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/dapphub/ds-test.git"
+ }
+}
diff --git a/election-guard/lib/forge-std/lib/ds-test/src/test.sol b/election-guard/lib/forge-std/lib/ds-test/src/test.sol
new file mode 100644
index 00000000..2bf33756
--- /dev/null
+++ b/election-guard/lib/forge-std/lib/ds-test/src/test.sol
@@ -0,0 +1,592 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+pragma solidity >=0.5.0;
+
+contract DSTest {
+ event log (string);
+ event logs (bytes);
+
+ event log_address (address);
+ event log_bytes32 (bytes32);
+ event log_int (int);
+ event log_uint (uint);
+ event log_bytes (bytes);
+ event log_string (string);
+
+ event log_named_address (string key, address val);
+ event log_named_bytes32 (string key, bytes32 val);
+ event log_named_decimal_int (string key, int val, uint decimals);
+ event log_named_decimal_uint (string key, uint val, uint decimals);
+ event log_named_int (string key, int val);
+ event log_named_uint (string key, uint val);
+ event log_named_bytes (string key, bytes val);
+ event log_named_string (string key, string val);
+
+ bool public IS_TEST = true;
+ bool private _failed;
+
+ address constant HEVM_ADDRESS =
+ address(bytes20(uint160(uint256(keccak256('hevm cheat code')))));
+
+ modifier mayRevert() { _; }
+ modifier testopts(string memory) { _; }
+
+ function failed() public returns (bool) {
+ if (_failed) {
+ return _failed;
+ } else {
+ bool globalFailed = false;
+ if (hasHEVMContext()) {
+ (, bytes memory retdata) = HEVM_ADDRESS.call(
+ abi.encodePacked(
+ bytes4(keccak256("load(address,bytes32)")),
+ abi.encode(HEVM_ADDRESS, bytes32("failed"))
+ )
+ );
+ globalFailed = abi.decode(retdata, (bool));
+ }
+ return globalFailed;
+ }
+ }
+
+ function fail() internal virtual {
+ if (hasHEVMContext()) {
+ (bool status, ) = HEVM_ADDRESS.call(
+ abi.encodePacked(
+ bytes4(keccak256("store(address,bytes32,bytes32)")),
+ abi.encode(HEVM_ADDRESS, bytes32("failed"), bytes32(uint256(0x01)))
+ )
+ );
+ status; // Silence compiler warnings
+ }
+ _failed = true;
+ }
+
+ function hasHEVMContext() internal view returns (bool) {
+ uint256 hevmCodeSize = 0;
+ assembly {
+ hevmCodeSize := extcodesize(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D)
+ }
+ return hevmCodeSize > 0;
+ }
+
+ modifier logs_gas() {
+ uint startGas = gasleft();
+ _;
+ uint endGas = gasleft();
+ emit log_named_uint("gas", startGas - endGas);
+ }
+
+ function assertTrue(bool condition) internal {
+ if (!condition) {
+ emit log("Error: Assertion Failed");
+ fail();
+ }
+ }
+
+ function assertTrue(bool condition, string memory err) internal {
+ if (!condition) {
+ emit log_named_string("Error", err);
+ assertTrue(condition);
+ }
+ }
+
+ function assertEq(address a, address b) internal {
+ if (a != b) {
+ emit log("Error: a == b not satisfied [address]");
+ emit log_named_address(" Left", a);
+ emit log_named_address(" Right", b);
+ fail();
+ }
+ }
+ function assertEq(address a, address b, string memory err) internal {
+ if (a != b) {
+ emit log_named_string ("Error", err);
+ assertEq(a, b);
+ }
+ }
+
+ function assertEq(bytes32 a, bytes32 b) internal {
+ if (a != b) {
+ emit log("Error: a == b not satisfied [bytes32]");
+ emit log_named_bytes32(" Left", a);
+ emit log_named_bytes32(" Right", b);
+ fail();
+ }
+ }
+ function assertEq(bytes32 a, bytes32 b, string memory err) internal {
+ if (a != b) {
+ emit log_named_string ("Error", err);
+ assertEq(a, b);
+ }
+ }
+ function assertEq32(bytes32 a, bytes32 b) internal {
+ assertEq(a, b);
+ }
+ function assertEq32(bytes32 a, bytes32 b, string memory err) internal {
+ assertEq(a, b, err);
+ }
+
+ function assertEq(int a, int b) internal {
+ if (a != b) {
+ emit log("Error: a == b not satisfied [int]");
+ emit log_named_int(" Left", a);
+ emit log_named_int(" Right", b);
+ fail();
+ }
+ }
+ function assertEq(int a, int b, string memory err) internal {
+ if (a != b) {
+ emit log_named_string("Error", err);
+ assertEq(a, b);
+ }
+ }
+ function assertEq(uint a, uint b) internal {
+ if (a != b) {
+ emit log("Error: a == b not satisfied [uint]");
+ emit log_named_uint(" Left", a);
+ emit log_named_uint(" Right", b);
+ fail();
+ }
+ }
+ function assertEq(uint a, uint b, string memory err) internal {
+ if (a != b) {
+ emit log_named_string("Error", err);
+ assertEq(a, b);
+ }
+ }
+ function assertEqDecimal(int a, int b, uint decimals) internal {
+ if (a != b) {
+ emit log("Error: a == b not satisfied [decimal int]");
+ emit log_named_decimal_int(" Left", a, decimals);
+ emit log_named_decimal_int(" Right", b, decimals);
+ fail();
+ }
+ }
+ function assertEqDecimal(int a, int b, uint decimals, string memory err) internal {
+ if (a != b) {
+ emit log_named_string("Error", err);
+ assertEqDecimal(a, b, decimals);
+ }
+ }
+ function assertEqDecimal(uint a, uint b, uint decimals) internal {
+ if (a != b) {
+ emit log("Error: a == b not satisfied [decimal uint]");
+ emit log_named_decimal_uint(" Left", a, decimals);
+ emit log_named_decimal_uint(" Right", b, decimals);
+ fail();
+ }
+ }
+ function assertEqDecimal(uint a, uint b, uint decimals, string memory err) internal {
+ if (a != b) {
+ emit log_named_string("Error", err);
+ assertEqDecimal(a, b, decimals);
+ }
+ }
+
+ function assertNotEq(address a, address b) internal {
+ if (a == b) {
+ emit log("Error: a != b not satisfied [address]");
+ emit log_named_address(" Left", a);
+ emit log_named_address(" Right", b);
+ fail();
+ }
+ }
+ function assertNotEq(address a, address b, string memory err) internal {
+ if (a == b) {
+ emit log_named_string ("Error", err);
+ assertNotEq(a, b);
+ }
+ }
+
+ function assertNotEq(bytes32 a, bytes32 b) internal {
+ if (a == b) {
+ emit log("Error: a != b not satisfied [bytes32]");
+ emit log_named_bytes32(" Left", a);
+ emit log_named_bytes32(" Right", b);
+ fail();
+ }
+ }
+ function assertNotEq(bytes32 a, bytes32 b, string memory err) internal {
+ if (a == b) {
+ emit log_named_string ("Error", err);
+ assertNotEq(a, b);
+ }
+ }
+ function assertNotEq32(bytes32 a, bytes32 b) internal {
+ assertNotEq(a, b);
+ }
+ function assertNotEq32(bytes32 a, bytes32 b, string memory err) internal {
+ assertNotEq(a, b, err);
+ }
+
+ function assertNotEq(int a, int b) internal {
+ if (a == b) {
+ emit log("Error: a != b not satisfied [int]");
+ emit log_named_int(" Left", a);
+ emit log_named_int(" Right", b);
+ fail();
+ }
+ }
+ function assertNotEq(int a, int b, string memory err) internal {
+ if (a == b) {
+ emit log_named_string("Error", err);
+ assertNotEq(a, b);
+ }
+ }
+ function assertNotEq(uint a, uint b) internal {
+ if (a == b) {
+ emit log("Error: a != b not satisfied [uint]");
+ emit log_named_uint(" Left", a);
+ emit log_named_uint(" Right", b);
+ fail();
+ }
+ }
+ function assertNotEq(uint a, uint b, string memory err) internal {
+ if (a == b) {
+ emit log_named_string("Error", err);
+ assertNotEq(a, b);
+ }
+ }
+ function assertNotEqDecimal(int a, int b, uint decimals) internal {
+ if (a == b) {
+ emit log("Error: a != b not satisfied [decimal int]");
+ emit log_named_decimal_int(" Left", a, decimals);
+ emit log_named_decimal_int(" Right", b, decimals);
+ fail();
+ }
+ }
+ function assertNotEqDecimal(int a, int b, uint decimals, string memory err) internal {
+ if (a == b) {
+ emit log_named_string("Error", err);
+ assertNotEqDecimal(a, b, decimals);
+ }
+ }
+ function assertNotEqDecimal(uint a, uint b, uint decimals) internal {
+ if (a == b) {
+ emit log("Error: a != b not satisfied [decimal uint]");
+ emit log_named_decimal_uint(" Left", a, decimals);
+ emit log_named_decimal_uint(" Right", b, decimals);
+ fail();
+ }
+ }
+ function assertNotEqDecimal(uint a, uint b, uint decimals, string memory err) internal {
+ if (a == b) {
+ emit log_named_string("Error", err);
+ assertNotEqDecimal(a, b, decimals);
+ }
+ }
+
+ function assertGt(uint a, uint b) internal {
+ if (a <= b) {
+ emit log("Error: a > b not satisfied [uint]");
+ emit log_named_uint(" Value a", a);
+ emit log_named_uint(" Value b", b);
+ fail();
+ }
+ }
+ function assertGt(uint a, uint b, string memory err) internal {
+ if (a <= b) {
+ emit log_named_string("Error", err);
+ assertGt(a, b);
+ }
+ }
+ function assertGt(int a, int b) internal {
+ if (a <= b) {
+ emit log("Error: a > b not satisfied [int]");
+ emit log_named_int(" Value a", a);
+ emit log_named_int(" Value b", b);
+ fail();
+ }
+ }
+ function assertGt(int a, int b, string memory err) internal {
+ if (a <= b) {
+ emit log_named_string("Error", err);
+ assertGt(a, b);
+ }
+ }
+ function assertGtDecimal(int a, int b, uint decimals) internal {
+ if (a <= b) {
+ emit log("Error: a > b not satisfied [decimal int]");
+ emit log_named_decimal_int(" Value a", a, decimals);
+ emit log_named_decimal_int(" Value b", b, decimals);
+ fail();
+ }
+ }
+ function assertGtDecimal(int a, int b, uint decimals, string memory err) internal {
+ if (a <= b) {
+ emit log_named_string("Error", err);
+ assertGtDecimal(a, b, decimals);
+ }
+ }
+ function assertGtDecimal(uint a, uint b, uint decimals) internal {
+ if (a <= b) {
+ emit log("Error: a > b not satisfied [decimal uint]");
+ emit log_named_decimal_uint(" Value a", a, decimals);
+ emit log_named_decimal_uint(" Value b", b, decimals);
+ fail();
+ }
+ }
+ function assertGtDecimal(uint a, uint b, uint decimals, string memory err) internal {
+ if (a <= b) {
+ emit log_named_string("Error", err);
+ assertGtDecimal(a, b, decimals);
+ }
+ }
+
+ function assertGe(uint a, uint b) internal {
+ if (a < b) {
+ emit log("Error: a >= b not satisfied [uint]");
+ emit log_named_uint(" Value a", a);
+ emit log_named_uint(" Value b", b);
+ fail();
+ }
+ }
+ function assertGe(uint a, uint b, string memory err) internal {
+ if (a < b) {
+ emit log_named_string("Error", err);
+ assertGe(a, b);
+ }
+ }
+ function assertGe(int a, int b) internal {
+ if (a < b) {
+ emit log("Error: a >= b not satisfied [int]");
+ emit log_named_int(" Value a", a);
+ emit log_named_int(" Value b", b);
+ fail();
+ }
+ }
+ function assertGe(int a, int b, string memory err) internal {
+ if (a < b) {
+ emit log_named_string("Error", err);
+ assertGe(a, b);
+ }
+ }
+ function assertGeDecimal(int a, int b, uint decimals) internal {
+ if (a < b) {
+ emit log("Error: a >= b not satisfied [decimal int]");
+ emit log_named_decimal_int(" Value a", a, decimals);
+ emit log_named_decimal_int(" Value b", b, decimals);
+ fail();
+ }
+ }
+ function assertGeDecimal(int a, int b, uint decimals, string memory err) internal {
+ if (a < b) {
+ emit log_named_string("Error", err);
+ assertGeDecimal(a, b, decimals);
+ }
+ }
+ function assertGeDecimal(uint a, uint b, uint decimals) internal {
+ if (a < b) {
+ emit log("Error: a >= b not satisfied [decimal uint]");
+ emit log_named_decimal_uint(" Value a", a, decimals);
+ emit log_named_decimal_uint(" Value b", b, decimals);
+ fail();
+ }
+ }
+ function assertGeDecimal(uint a, uint b, uint decimals, string memory err) internal {
+ if (a < b) {
+ emit log_named_string("Error", err);
+ assertGeDecimal(a, b, decimals);
+ }
+ }
+
+ function assertLt(uint a, uint b) internal {
+ if (a >= b) {
+ emit log("Error: a < b not satisfied [uint]");
+ emit log_named_uint(" Value a", a);
+ emit log_named_uint(" Value b", b);
+ fail();
+ }
+ }
+ function assertLt(uint a, uint b, string memory err) internal {
+ if (a >= b) {
+ emit log_named_string("Error", err);
+ assertLt(a, b);
+ }
+ }
+ function assertLt(int a, int b) internal {
+ if (a >= b) {
+ emit log("Error: a < b not satisfied [int]");
+ emit log_named_int(" Value a", a);
+ emit log_named_int(" Value b", b);
+ fail();
+ }
+ }
+ function assertLt(int a, int b, string memory err) internal {
+ if (a >= b) {
+ emit log_named_string("Error", err);
+ assertLt(a, b);
+ }
+ }
+ function assertLtDecimal(int a, int b, uint decimals) internal {
+ if (a >= b) {
+ emit log("Error: a < b not satisfied [decimal int]");
+ emit log_named_decimal_int(" Value a", a, decimals);
+ emit log_named_decimal_int(" Value b", b, decimals);
+ fail();
+ }
+ }
+ function assertLtDecimal(int a, int b, uint decimals, string memory err) internal {
+ if (a >= b) {
+ emit log_named_string("Error", err);
+ assertLtDecimal(a, b, decimals);
+ }
+ }
+ function assertLtDecimal(uint a, uint b, uint decimals) internal {
+ if (a >= b) {
+ emit log("Error: a < b not satisfied [decimal uint]");
+ emit log_named_decimal_uint(" Value a", a, decimals);
+ emit log_named_decimal_uint(" Value b", b, decimals);
+ fail();
+ }
+ }
+ function assertLtDecimal(uint a, uint b, uint decimals, string memory err) internal {
+ if (a >= b) {
+ emit log_named_string("Error", err);
+ assertLtDecimal(a, b, decimals);
+ }
+ }
+
+ function assertLe(uint a, uint b) internal {
+ if (a > b) {
+ emit log("Error: a <= b not satisfied [uint]");
+ emit log_named_uint(" Value a", a);
+ emit log_named_uint(" Value b", b);
+ fail();
+ }
+ }
+ function assertLe(uint a, uint b, string memory err) internal {
+ if (a > b) {
+ emit log_named_string("Error", err);
+ assertLe(a, b);
+ }
+ }
+ function assertLe(int a, int b) internal {
+ if (a > b) {
+ emit log("Error: a <= b not satisfied [int]");
+ emit log_named_int(" Value a", a);
+ emit log_named_int(" Value b", b);
+ fail();
+ }
+ }
+ function assertLe(int a, int b, string memory err) internal {
+ if (a > b) {
+ emit log_named_string("Error", err);
+ assertLe(a, b);
+ }
+ }
+ function assertLeDecimal(int a, int b, uint decimals) internal {
+ if (a > b) {
+ emit log("Error: a <= b not satisfied [decimal int]");
+ emit log_named_decimal_int(" Value a", a, decimals);
+ emit log_named_decimal_int(" Value b", b, decimals);
+ fail();
+ }
+ }
+ function assertLeDecimal(int a, int b, uint decimals, string memory err) internal {
+ if (a > b) {
+ emit log_named_string("Error", err);
+ assertLeDecimal(a, b, decimals);
+ }
+ }
+ function assertLeDecimal(uint a, uint b, uint decimals) internal {
+ if (a > b) {
+ emit log("Error: a <= b not satisfied [decimal uint]");
+ emit log_named_decimal_uint(" Value a", a, decimals);
+ emit log_named_decimal_uint(" Value b", b, decimals);
+ fail();
+ }
+ }
+ function assertLeDecimal(uint a, uint b, uint decimals, string memory err) internal {
+ if (a > b) {
+ emit log_named_string("Error", err);
+ assertLeDecimal(a, b, decimals);
+ }
+ }
+
+ function assertEq(string memory a, string memory b) internal {
+ if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) {
+ emit log("Error: a == b not satisfied [string]");
+ emit log_named_string(" Left", a);
+ emit log_named_string(" Right", b);
+ fail();
+ }
+ }
+ function assertEq(string memory a, string memory b, string memory err) internal {
+ if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) {
+ emit log_named_string("Error", err);
+ assertEq(a, b);
+ }
+ }
+
+ function assertNotEq(string memory a, string memory b) internal {
+ if (keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b))) {
+ emit log("Error: a != b not satisfied [string]");
+ emit log_named_string(" Left", a);
+ emit log_named_string(" Right", b);
+ fail();
+ }
+ }
+ function assertNotEq(string memory a, string memory b, string memory err) internal {
+ if (keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b))) {
+ emit log_named_string("Error", err);
+ assertNotEq(a, b);
+ }
+ }
+
+ function checkEq0(bytes memory a, bytes memory b) internal pure returns (bool ok) {
+ ok = true;
+ if (a.length == b.length) {
+ for (uint i = 0; i < a.length; i++) {
+ if (a[i] != b[i]) {
+ ok = false;
+ }
+ }
+ } else {
+ ok = false;
+ }
+ }
+ function assertEq0(bytes memory a, bytes memory b) internal {
+ if (!checkEq0(a, b)) {
+ emit log("Error: a == b not satisfied [bytes]");
+ emit log_named_bytes(" Left", a);
+ emit log_named_bytes(" Right", b);
+ fail();
+ }
+ }
+ function assertEq0(bytes memory a, bytes memory b, string memory err) internal {
+ if (!checkEq0(a, b)) {
+ emit log_named_string("Error", err);
+ assertEq0(a, b);
+ }
+ }
+
+ function assertNotEq0(bytes memory a, bytes memory b) internal {
+ if (checkEq0(a, b)) {
+ emit log("Error: a != b not satisfied [bytes]");
+ emit log_named_bytes(" Left", a);
+ emit log_named_bytes(" Right", b);
+ fail();
+ }
+ }
+ function assertNotEq0(bytes memory a, bytes memory b, string memory err) internal {
+ if (checkEq0(a, b)) {
+ emit log_named_string("Error", err);
+ assertNotEq0(a, b);
+ }
+ }
+}
diff --git a/election-guard/lib/forge-std/lib/ds-test/src/test.t.sol b/election-guard/lib/forge-std/lib/ds-test/src/test.t.sol
new file mode 100644
index 00000000..d277a309
--- /dev/null
+++ b/election-guard/lib/forge-std/lib/ds-test/src/test.t.sol
@@ -0,0 +1,417 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+pragma solidity >=0.5.0;
+
+import {DSTest} from "./test.sol";
+
+contract DemoTest is DSTest {
+
+ // --- assertTrue ---
+
+ function testAssertTrue() public {
+ assertTrue(true, "msg");
+ assertTrue(true);
+ }
+ function testFailAssertTrue() public {
+ assertTrue(false);
+ }
+ function testFailAssertTrueWithMsg() public {
+ assertTrue(false, "msg");
+ }
+
+ // --- assertEq (Addr) ---
+
+ function testAssertEqAddr() public {
+ assertEq(address(0x0), address(0x0), "msg");
+ assertEq(address(0x0), address(0x0));
+ }
+ function testFailAssertEqAddr() public {
+ assertEq(address(0x0), address(0x1));
+ }
+ function testFailAssertEqAddrWithMsg() public {
+ assertEq(address(0x0), address(0x1), "msg");
+ }
+
+ // --- assertEq (Bytes32) ---
+
+ function testAssertEqBytes32() public {
+ assertEq(bytes32("hi"), bytes32("hi"), "msg");
+ assertEq(bytes32("hi"), bytes32("hi"));
+ }
+ function testFailAssertEqBytes32() public {
+ assertEq(bytes32("hi"), bytes32("ho"));
+ }
+ function testFailAssertEqBytes32WithMsg() public {
+ assertEq(bytes32("hi"), bytes32("ho"), "msg");
+ }
+
+ // --- assertEq (Int) ---
+
+ function testAssertEqInt() public {
+ assertEq(-1, -1, "msg");
+ assertEq(-1, -1);
+ }
+ function testFailAssertEqInt() public {
+ assertEq(-1, -2);
+ }
+ function testFailAssertEqIntWithMsg() public {
+ assertEq(-1, -2, "msg");
+ }
+
+ // --- assertEq (UInt) ---
+
+ function testAssertEqUInt() public {
+ assertEq(uint(1), uint(1), "msg");
+ assertEq(uint(1), uint(1));
+ }
+ function testFailAssertEqUInt() public {
+ assertEq(uint(1), uint(2));
+ }
+ function testFailAssertEqUIntWithMsg() public {
+ assertEq(uint(1), uint(2), "msg");
+ }
+
+ // --- assertEqDecimal (Int) ---
+
+ function testAssertEqDecimalInt() public {
+ assertEqDecimal(-1, -1, 18, "msg");
+ assertEqDecimal(-1, -1, 18);
+ }
+ function testFailAssertEqDecimalInt() public {
+ assertEqDecimal(-1, -2, 18);
+ }
+ function testFailAssertEqDecimalIntWithMsg() public {
+ assertEqDecimal(-1, -2, 18, "msg");
+ }
+
+ // --- assertEqDecimal (UInt) ---
+
+ function testAssertEqDecimalUInt() public {
+ assertEqDecimal(uint(1), uint(1), 18, "msg");
+ assertEqDecimal(uint(1), uint(1), 18);
+ }
+ function testFailAssertEqDecimalUInt() public {
+ assertEqDecimal(uint(1), uint(2), 18);
+ }
+ function testFailAssertEqDecimalUIntWithMsg() public {
+ assertEqDecimal(uint(1), uint(2), 18, "msg");
+ }
+
+ // --- assertNotEq (Addr) ---
+
+ function testAssertNotEqAddr() public {
+ assertNotEq(address(0x0), address(0x1), "msg");
+ assertNotEq(address(0x0), address(0x1));
+ }
+ function testFailAssertNotEqAddr() public {
+ assertNotEq(address(0x0), address(0x0));
+ }
+ function testFailAssertNotEqAddrWithMsg() public {
+ assertNotEq(address(0x0), address(0x0), "msg");
+ }
+
+ // --- assertNotEq (Bytes32) ---
+
+ function testAssertNotEqBytes32() public {
+ assertNotEq(bytes32("hi"), bytes32("ho"), "msg");
+ assertNotEq(bytes32("hi"), bytes32("ho"));
+ }
+ function testFailAssertNotEqBytes32() public {
+ assertNotEq(bytes32("hi"), bytes32("hi"));
+ }
+ function testFailAssertNotEqBytes32WithMsg() public {
+ assertNotEq(bytes32("hi"), bytes32("hi"), "msg");
+ }
+
+ // --- assertNotEq (Int) ---
+
+ function testAssertNotEqInt() public {
+ assertNotEq(-1, -2, "msg");
+ assertNotEq(-1, -2);
+ }
+ function testFailAssertNotEqInt() public {
+ assertNotEq(-1, -1);
+ }
+ function testFailAssertNotEqIntWithMsg() public {
+ assertNotEq(-1, -1, "msg");
+ }
+
+ // --- assertNotEq (UInt) ---
+
+ function testAssertNotEqUInt() public {
+ assertNotEq(uint(1), uint(2), "msg");
+ assertNotEq(uint(1), uint(2));
+ }
+ function testFailAssertNotEqUInt() public {
+ assertNotEq(uint(1), uint(1));
+ }
+ function testFailAssertNotEqUIntWithMsg() public {
+ assertNotEq(uint(1), uint(1), "msg");
+ }
+
+ // --- assertNotEqDecimal (Int) ---
+
+ function testAssertNotEqDecimalInt() public {
+ assertNotEqDecimal(-1, -2, 18, "msg");
+ assertNotEqDecimal(-1, -2, 18);
+ }
+ function testFailAssertNotEqDecimalInt() public {
+ assertNotEqDecimal(-1, -1, 18);
+ }
+ function testFailAssertNotEqDecimalIntWithMsg() public {
+ assertNotEqDecimal(-1, -1, 18, "msg");
+ }
+
+ // --- assertNotEqDecimal (UInt) ---
+
+ function testAssertNotEqDecimalUInt() public {
+ assertNotEqDecimal(uint(1), uint(2), 18, "msg");
+ assertNotEqDecimal(uint(1), uint(2), 18);
+ }
+ function testFailAssertNotEqDecimalUInt() public {
+ assertNotEqDecimal(uint(1), uint(1), 18);
+ }
+ function testFailAssertNotEqDecimalUIntWithMsg() public {
+ assertNotEqDecimal(uint(1), uint(1), 18, "msg");
+ }
+
+ // --- assertGt (UInt) ---
+
+ function testAssertGtUInt() public {
+ assertGt(uint(2), uint(1), "msg");
+ assertGt(uint(3), uint(2));
+ }
+ function testFailAssertGtUInt() public {
+ assertGt(uint(1), uint(2));
+ }
+ function testFailAssertGtUIntWithMsg() public {
+ assertGt(uint(1), uint(2), "msg");
+ }
+
+ // --- assertGt (Int) ---
+
+ function testAssertGtInt() public {
+ assertGt(-1, -2, "msg");
+ assertGt(-1, -3);
+ }
+ function testFailAssertGtInt() public {
+ assertGt(-2, -1);
+ }
+ function testFailAssertGtIntWithMsg() public {
+ assertGt(-2, -1, "msg");
+ }
+
+ // --- assertGtDecimal (UInt) ---
+
+ function testAssertGtDecimalUInt() public {
+ assertGtDecimal(uint(2), uint(1), 18, "msg");
+ assertGtDecimal(uint(3), uint(2), 18);
+ }
+ function testFailAssertGtDecimalUInt() public {
+ assertGtDecimal(uint(1), uint(2), 18);
+ }
+ function testFailAssertGtDecimalUIntWithMsg() public {
+ assertGtDecimal(uint(1), uint(2), 18, "msg");
+ }
+
+ // --- assertGtDecimal (Int) ---
+
+ function testAssertGtDecimalInt() public {
+ assertGtDecimal(-1, -2, 18, "msg");
+ assertGtDecimal(-1, -3, 18);
+ }
+ function testFailAssertGtDecimalInt() public {
+ assertGtDecimal(-2, -1, 18);
+ }
+ function testFailAssertGtDecimalIntWithMsg() public {
+ assertGtDecimal(-2, -1, 18, "msg");
+ }
+
+ // --- assertGe (UInt) ---
+
+ function testAssertGeUInt() public {
+ assertGe(uint(2), uint(1), "msg");
+ assertGe(uint(2), uint(2));
+ }
+ function testFailAssertGeUInt() public {
+ assertGe(uint(1), uint(2));
+ }
+ function testFailAssertGeUIntWithMsg() public {
+ assertGe(uint(1), uint(2), "msg");
+ }
+
+ // --- assertGe (Int) ---
+
+ function testAssertGeInt() public {
+ assertGe(-1, -2, "msg");
+ assertGe(-1, -1);
+ }
+ function testFailAssertGeInt() public {
+ assertGe(-2, -1);
+ }
+ function testFailAssertGeIntWithMsg() public {
+ assertGe(-2, -1, "msg");
+ }
+
+ // --- assertGeDecimal (UInt) ---
+
+ function testAssertGeDecimalUInt() public {
+ assertGeDecimal(uint(2), uint(1), 18, "msg");
+ assertGeDecimal(uint(2), uint(2), 18);
+ }
+ function testFailAssertGeDecimalUInt() public {
+ assertGeDecimal(uint(1), uint(2), 18);
+ }
+ function testFailAssertGeDecimalUIntWithMsg() public {
+ assertGeDecimal(uint(1), uint(2), 18, "msg");
+ }
+
+ // --- assertGeDecimal (Int) ---
+
+ function testAssertGeDecimalInt() public {
+ assertGeDecimal(-1, -2, 18, "msg");
+ assertGeDecimal(-1, -2, 18);
+ }
+ function testFailAssertGeDecimalInt() public {
+ assertGeDecimal(-2, -1, 18);
+ }
+ function testFailAssertGeDecimalIntWithMsg() public {
+ assertGeDecimal(-2, -1, 18, "msg");
+ }
+
+ // --- assertLt (UInt) ---
+
+ function testAssertLtUInt() public {
+ assertLt(uint(1), uint(2), "msg");
+ assertLt(uint(1), uint(3));
+ }
+ function testFailAssertLtUInt() public {
+ assertLt(uint(2), uint(2));
+ }
+ function testFailAssertLtUIntWithMsg() public {
+ assertLt(uint(3), uint(2), "msg");
+ }
+
+ // --- assertLt (Int) ---
+
+ function testAssertLtInt() public {
+ assertLt(-2, -1, "msg");
+ assertLt(-1, 0);
+ }
+ function testFailAssertLtInt() public {
+ assertLt(-1, -2);
+ }
+ function testFailAssertLtIntWithMsg() public {
+ assertLt(-1, -1, "msg");
+ }
+
+ // --- assertLtDecimal (UInt) ---
+
+ function testAssertLtDecimalUInt() public {
+ assertLtDecimal(uint(1), uint(2), 18, "msg");
+ assertLtDecimal(uint(2), uint(3), 18);
+ }
+ function testFailAssertLtDecimalUInt() public {
+ assertLtDecimal(uint(1), uint(1), 18);
+ }
+ function testFailAssertLtDecimalUIntWithMsg() public {
+ assertLtDecimal(uint(2), uint(1), 18, "msg");
+ }
+
+ // --- assertLtDecimal (Int) ---
+
+ function testAssertLtDecimalInt() public {
+ assertLtDecimal(-2, -1, 18, "msg");
+ assertLtDecimal(-2, -1, 18);
+ }
+ function testFailAssertLtDecimalInt() public {
+ assertLtDecimal(-2, -2, 18);
+ }
+ function testFailAssertLtDecimalIntWithMsg() public {
+ assertLtDecimal(-1, -2, 18, "msg");
+ }
+
+ // --- assertLe (UInt) ---
+
+ function testAssertLeUInt() public {
+ assertLe(uint(1), uint(2), "msg");
+ assertLe(uint(1), uint(1));
+ }
+ function testFailAssertLeUInt() public {
+ assertLe(uint(4), uint(2));
+ }
+ function testFailAssertLeUIntWithMsg() public {
+ assertLe(uint(3), uint(2), "msg");
+ }
+
+ // --- assertLe (Int) ---
+
+ function testAssertLeInt() public {
+ assertLe(-2, -1, "msg");
+ assertLe(-1, -1);
+ }
+ function testFailAssertLeInt() public {
+ assertLe(-1, -2);
+ }
+ function testFailAssertLeIntWithMsg() public {
+ assertLe(-1, -3, "msg");
+ }
+
+ // --- assertLeDecimal (UInt) ---
+
+ function testAssertLeDecimalUInt() public {
+ assertLeDecimal(uint(1), uint(2), 18, "msg");
+ assertLeDecimal(uint(2), uint(2), 18);
+ }
+ function testFailAssertLeDecimalUInt() public {
+ assertLeDecimal(uint(1), uint(0), 18);
+ }
+ function testFailAssertLeDecimalUIntWithMsg() public {
+ assertLeDecimal(uint(1), uint(0), 18, "msg");
+ }
+
+ // --- assertLeDecimal (Int) ---
+
+ function testAssertLeDecimalInt() public {
+ assertLeDecimal(-2, -1, 18, "msg");
+ assertLeDecimal(-2, -2, 18);
+ }
+ function testFailAssertLeDecimalInt() public {
+ assertLeDecimal(-2, -3, 18);
+ }
+ function testFailAssertLeDecimalIntWithMsg() public {
+ assertLeDecimal(-1, -2, 18, "msg");
+ }
+
+ // --- assertNotEq (String) ---
+
+ function testAssertNotEqString() public {
+ assertNotEq(new string(1), new string(2), "msg");
+ assertNotEq(new string(1), new string(2));
+ }
+ function testFailAssertNotEqString() public {
+ assertNotEq(new string(1), new string(1));
+ }
+ function testFailAssertNotEqStringWithMsg() public {
+ assertNotEq(new string(1), new string(1), "msg");
+ }
+
+ // --- assertNotEq0 (Bytes) ---
+
+ function testAssertNotEq0Bytes() public {
+ assertNotEq0(bytes("hi"), bytes("ho"), "msg");
+ assertNotEq0(bytes("hi"), bytes("ho"));
+ }
+ function testFailAssertNotEq0Bytes() public {
+ assertNotEq0(bytes("hi"), bytes("hi"));
+ }
+ function testFailAssertNotEq0BytesWithMsg() public {
+ assertNotEq0(bytes("hi"), bytes("hi"), "msg");
+ }
+
+ // --- fail override ---
+
+ // ensure that fail can be overridden
+ function fail() internal override {
+ super.fail();
+ }
+}
diff --git a/election-guard/lib/forge-std/package.json b/election-guard/lib/forge-std/package.json
new file mode 100644
index 00000000..f39bb398
--- /dev/null
+++ b/election-guard/lib/forge-std/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "forge-std",
+ "version": "1.5.6",
+ "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.",
+ "homepage": "https://book.getfoundry.sh/forge/forge-std",
+ "bugs": "https://github.com/foundry-rs/forge-std/issues",
+ "license": "(Apache-2.0 OR MIT)",
+ "author": "Contributors to Forge Standard Library",
+ "files": [
+ "src/**/*"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/foundry-rs/forge-std.git"
+ }
+}
diff --git a/election-guard/lib/forge-std/src/Base.sol b/election-guard/lib/forge-std/src/Base.sol
new file mode 100644
index 00000000..851ac0cd
--- /dev/null
+++ b/election-guard/lib/forge-std/src/Base.sol
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+import {StdStorage} from "./StdStorage.sol";
+import {Vm, VmSafe} from "./Vm.sol";
+
+abstract contract CommonBase {
+ // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D.
+ address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code"))));
+ // console.sol and console2.sol work by executing a staticcall to this address.
+ address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;
+ // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.
+ address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
+ // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38.
+ address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256("foundry default caller"))));
+ // Address of the test contract, deployed by the DEFAULT_SENDER.
+ address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;
+ // Deterministic deployment address of the Multicall3 contract.
+ address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11;
+ // The order of the secp256k1 curve.
+ uint256 internal constant SECP256K1_ORDER =
+ 115792089237316195423570985008687907852837564279074904382605163141518161494337;
+
+ uint256 internal constant UINT256_MAX =
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ Vm internal constant vm = Vm(VM_ADDRESS);
+ StdStorage internal stdstore;
+}
+
+abstract contract TestBase is CommonBase {}
+
+abstract contract ScriptBase is CommonBase {
+ VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS);
+}
diff --git a/election-guard/lib/forge-std/src/Script.sol b/election-guard/lib/forge-std/src/Script.sol
new file mode 100644
index 00000000..bffccadb
--- /dev/null
+++ b/election-guard/lib/forge-std/src/Script.sol
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+// 💬 ABOUT
+// Standard Library's default Script.
+
+// 🧩 MODULES
+import {ScriptBase} from "./Base.sol";
+import {console} from "./console.sol";
+import {console2} from "./console2.sol";
+import {StdChains} from "./StdChains.sol";
+import {StdCheatsSafe} from "./StdCheats.sol";
+import {stdJson} from "./StdJson.sol";
+import {stdMath} from "./StdMath.sol";
+import {StdStorage, stdStorageSafe} from "./StdStorage.sol";
+import {StdUtils} from "./StdUtils.sol";
+import {VmSafe} from "./Vm.sol";
+
+// 📦 BOILERPLATE
+import {ScriptBase} from "./Base.sol";
+
+// ⭐️ SCRIPT
+abstract contract Script is StdChains, StdCheatsSafe, StdUtils, ScriptBase {
+ // Note: IS_SCRIPT() must return true.
+ bool public IS_SCRIPT = true;
+}
diff --git a/election-guard/lib/forge-std/src/StdAssertions.sol b/election-guard/lib/forge-std/src/StdAssertions.sol
new file mode 100644
index 00000000..2778b3a0
--- /dev/null
+++ b/election-guard/lib/forge-std/src/StdAssertions.sol
@@ -0,0 +1,376 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+import {DSTest} from "ds-test/test.sol";
+import {stdMath} from "./StdMath.sol";
+
+abstract contract StdAssertions is DSTest {
+ event log_array(uint256[] val);
+ event log_array(int256[] val);
+ event log_array(address[] val);
+ event log_named_array(string key, uint256[] val);
+ event log_named_array(string key, int256[] val);
+ event log_named_array(string key, address[] val);
+
+ function fail(string memory err) internal virtual {
+ emit log_named_string("Error", err);
+ fail();
+ }
+
+ function assertFalse(bool data) internal virtual {
+ assertTrue(!data);
+ }
+
+ function assertFalse(bool data, string memory err) internal virtual {
+ assertTrue(!data, err);
+ }
+
+ function assertEq(bool a, bool b) internal virtual {
+ if (a != b) {
+ emit log("Error: a == b not satisfied [bool]");
+ emit log_named_string(" Left", a ? "true" : "false");
+ emit log_named_string(" Right", b ? "true" : "false");
+ fail();
+ }
+ }
+
+ function assertEq(bool a, bool b, string memory err) internal virtual {
+ if (a != b) {
+ emit log_named_string("Error", err);
+ assertEq(a, b);
+ }
+ }
+
+ function assertEq(bytes memory a, bytes memory b) internal virtual {
+ assertEq0(a, b);
+ }
+
+ function assertEq(bytes memory a, bytes memory b, string memory err) internal virtual {
+ assertEq0(a, b, err);
+ }
+
+ function assertEq(uint256[] memory a, uint256[] memory b) internal virtual {
+ if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
+ emit log("Error: a == b not satisfied [uint[]]");
+ emit log_named_array(" Left", a);
+ emit log_named_array(" Right", b);
+ fail();
+ }
+ }
+
+ function assertEq(int256[] memory a, int256[] memory b) internal virtual {
+ if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
+ emit log("Error: a == b not satisfied [int[]]");
+ emit log_named_array(" Left", a);
+ emit log_named_array(" Right", b);
+ fail();
+ }
+ }
+
+ function assertEq(address[] memory a, address[] memory b) internal virtual {
+ if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
+ emit log("Error: a == b not satisfied [address[]]");
+ emit log_named_array(" Left", a);
+ emit log_named_array(" Right", b);
+ fail();
+ }
+ }
+
+ function assertEq(uint256[] memory a, uint256[] memory b, string memory err) internal virtual {
+ if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
+ emit log_named_string("Error", err);
+ assertEq(a, b);
+ }
+ }
+
+ function assertEq(int256[] memory a, int256[] memory b, string memory err) internal virtual {
+ if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
+ emit log_named_string("Error", err);
+ assertEq(a, b);
+ }
+ }
+
+ function assertEq(address[] memory a, address[] memory b, string memory err) internal virtual {
+ if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
+ emit log_named_string("Error", err);
+ assertEq(a, b);
+ }
+ }
+
+ // Legacy helper
+ function assertEqUint(uint256 a, uint256 b) internal virtual {
+ assertEq(uint256(a), uint256(b));
+ }
+
+ function assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta) internal virtual {
+ uint256 delta = stdMath.delta(a, b);
+
+ if (delta > maxDelta) {
+ emit log("Error: a ~= b not satisfied [uint]");
+ emit log_named_uint(" Left", a);
+ emit log_named_uint(" Right", b);
+ emit log_named_uint(" Max Delta", maxDelta);
+ emit log_named_uint(" Delta", delta);
+ fail();
+ }
+ }
+
+ function assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, string memory err) internal virtual {
+ uint256 delta = stdMath.delta(a, b);
+
+ if (delta > maxDelta) {
+ emit log_named_string("Error", err);
+ assertApproxEqAbs(a, b, maxDelta);
+ }
+ }
+
+ function assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) internal virtual {
+ uint256 delta = stdMath.delta(a, b);
+
+ if (delta > maxDelta) {
+ emit log("Error: a ~= b not satisfied [uint]");
+ emit log_named_decimal_uint(" Left", a, decimals);
+ emit log_named_decimal_uint(" Right", b, decimals);
+ emit log_named_decimal_uint(" Max Delta", maxDelta, decimals);
+ emit log_named_decimal_uint(" Delta", delta, decimals);
+ fail();
+ }
+ }
+
+ function assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals, string memory err)
+ internal
+ virtual
+ {
+ uint256 delta = stdMath.delta(a, b);
+
+ if (delta > maxDelta) {
+ emit log_named_string("Error", err);
+ assertApproxEqAbsDecimal(a, b, maxDelta, decimals);
+ }
+ }
+
+ function assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta) internal virtual {
+ uint256 delta = stdMath.delta(a, b);
+
+ if (delta > maxDelta) {
+ emit log("Error: a ~= b not satisfied [int]");
+ emit log_named_int(" Left", a);
+ emit log_named_int(" Right", b);
+ emit log_named_uint(" Max Delta", maxDelta);
+ emit log_named_uint(" Delta", delta);
+ fail();
+ }
+ }
+
+ function assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, string memory err) internal virtual {
+ uint256 delta = stdMath.delta(a, b);
+
+ if (delta > maxDelta) {
+ emit log_named_string("Error", err);
+ assertApproxEqAbs(a, b, maxDelta);
+ }
+ }
+
+ function assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals) internal virtual {
+ uint256 delta = stdMath.delta(a, b);
+
+ if (delta > maxDelta) {
+ emit log("Error: a ~= b not satisfied [int]");
+ emit log_named_decimal_int(" Left", a, decimals);
+ emit log_named_decimal_int(" Right", b, decimals);
+ emit log_named_decimal_uint(" Max Delta", maxDelta, decimals);
+ emit log_named_decimal_uint(" Delta", delta, decimals);
+ fail();
+ }
+ }
+
+ function assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals, string memory err)
+ internal
+ virtual
+ {
+ uint256 delta = stdMath.delta(a, b);
+
+ if (delta > maxDelta) {
+ emit log_named_string("Error", err);
+ assertApproxEqAbsDecimal(a, b, maxDelta, decimals);
+ }
+ }
+
+ function assertApproxEqRel(
+ uint256 a,
+ uint256 b,
+ uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100%
+ ) internal virtual {
+ if (b == 0) return assertEq(a, b); // If the left is 0, right must be too.
+
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ if (percentDelta > maxPercentDelta) {
+ emit log("Error: a ~= b not satisfied [uint]");
+ emit log_named_uint(" Left", a);
+ emit log_named_uint(" Right", b);
+ emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18);
+ emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18);
+ fail();
+ }
+ }
+
+ function assertApproxEqRel(
+ uint256 a,
+ uint256 b,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ string memory err
+ ) internal virtual {
+ if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too.
+
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ if (percentDelta > maxPercentDelta) {
+ emit log_named_string("Error", err);
+ assertApproxEqRel(a, b, maxPercentDelta);
+ }
+ }
+
+ function assertApproxEqRelDecimal(
+ uint256 a,
+ uint256 b,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals
+ ) internal virtual {
+ if (b == 0) return assertEq(a, b); // If the left is 0, right must be too.
+
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ if (percentDelta > maxPercentDelta) {
+ emit log("Error: a ~= b not satisfied [uint]");
+ emit log_named_decimal_uint(" Left", a, decimals);
+ emit log_named_decimal_uint(" Right", b, decimals);
+ emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18);
+ emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18);
+ fail();
+ }
+ }
+
+ function assertApproxEqRelDecimal(
+ uint256 a,
+ uint256 b,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals,
+ string memory err
+ ) internal virtual {
+ if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too.
+
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ if (percentDelta > maxPercentDelta) {
+ emit log_named_string("Error", err);
+ assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals);
+ }
+ }
+
+ function assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta) internal virtual {
+ if (b == 0) return assertEq(a, b); // If the left is 0, right must be too.
+
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ if (percentDelta > maxPercentDelta) {
+ emit log("Error: a ~= b not satisfied [int]");
+ emit log_named_int(" Left", a);
+ emit log_named_int(" Right", b);
+ emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18);
+ emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18);
+ fail();
+ }
+ }
+
+ function assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, string memory err) internal virtual {
+ if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too.
+
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ if (percentDelta > maxPercentDelta) {
+ emit log_named_string("Error", err);
+ assertApproxEqRel(a, b, maxPercentDelta);
+ }
+ }
+
+ function assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals) internal virtual {
+ if (b == 0) return assertEq(a, b); // If the left is 0, right must be too.
+
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ if (percentDelta > maxPercentDelta) {
+ emit log("Error: a ~= b not satisfied [int]");
+ emit log_named_decimal_int(" Left", a, decimals);
+ emit log_named_decimal_int(" Right", b, decimals);
+ emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18);
+ emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18);
+ fail();
+ }
+ }
+
+ function assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals, string memory err)
+ internal
+ virtual
+ {
+ if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too.
+
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ if (percentDelta > maxPercentDelta) {
+ emit log_named_string("Error", err);
+ assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals);
+ }
+ }
+
+ function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual {
+ assertEqCall(target, callDataA, target, callDataB, true);
+ }
+
+ function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB)
+ internal
+ virtual
+ {
+ assertEqCall(targetA, callDataA, targetB, callDataB, true);
+ }
+
+ function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData)
+ internal
+ virtual
+ {
+ assertEqCall(target, callDataA, target, callDataB, strictRevertData);
+ }
+
+ function assertEqCall(
+ address targetA,
+ bytes memory callDataA,
+ address targetB,
+ bytes memory callDataB,
+ bool strictRevertData
+ ) internal virtual {
+ (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA);
+ (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB);
+
+ if (successA && successB) {
+ assertEq(returnDataA, returnDataB, "Call return data does not match");
+ }
+
+ if (!successA && !successB && strictRevertData) {
+ assertEq(returnDataA, returnDataB, "Call revert data does not match");
+ }
+
+ if (!successA && successB) {
+ emit log("Error: Calls were not equal");
+ emit log_named_bytes(" Left call revert data", returnDataA);
+ emit log_named_bytes(" Right call return data", returnDataB);
+ fail();
+ }
+
+ if (successA && !successB) {
+ emit log("Error: Calls were not equal");
+ emit log_named_bytes(" Left call return data", returnDataA);
+ emit log_named_bytes(" Right call revert data", returnDataB);
+ fail();
+ }
+ }
+}
diff --git a/election-guard/lib/forge-std/src/StdChains.sol b/election-guard/lib/forge-std/src/StdChains.sol
new file mode 100644
index 00000000..f97637fc
--- /dev/null
+++ b/election-guard/lib/forge-std/src/StdChains.sol
@@ -0,0 +1,231 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {VmSafe} from "./Vm.sol";
+
+/**
+ * StdChains provides information about EVM compatible chains that can be used in scripts/tests.
+ * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are
+ * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of
+ * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the
+ * alias used in this contract, which can be found as the first argument to the
+ * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function.
+ *
+ * There are two main ways to use this contract:
+ * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or
+ * `setChain(string memory chainAlias, Chain memory chain)`
+ * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`.
+ *
+ * The first time either of those are used, chains are initialized with the default set of RPC URLs.
+ * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in
+ * `defaultRpcUrls`.
+ *
+ * The `setChain` function is straightforward, and it simply saves off the given chain data.
+ *
+ * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say
+ * we want to retrieve the RPC URL for `mainnet`:
+ * - If you have specified data with `setChain`, it will return that.
+ * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it
+ * is valid (e.g. a URL is specified, or an environment variable is given and exists).
+ * - If neither of the above conditions is met, the default data is returned.
+ *
+ * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults.
+ */
+abstract contract StdChains {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ bool private stdChainsInitialized;
+
+ struct ChainData {
+ string name;
+ uint256 chainId;
+ string rpcUrl;
+ }
+
+ struct Chain {
+ // The chain name.
+ string name;
+ // The chain's Chain ID.
+ uint256 chainId;
+ // The chain's alias. (i.e. what gets specified in `foundry.toml`).
+ string chainAlias;
+ // A default RPC endpoint for this chain.
+ // NOTE: This default RPC URL is included for convenience to facilitate quick tests and
+ // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy
+ // usage as you will be throttled and this is a disservice to others who need this endpoint.
+ string rpcUrl;
+ }
+
+ // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data.
+ mapping(string => Chain) private chains;
+ // Maps from the chain's alias to it's default RPC URL.
+ mapping(string => string) private defaultRpcUrls;
+ // Maps from a chain ID to it's alias.
+ mapping(uint256 => string) private idToAlias;
+
+ bool private fallbackToDefaultRpcUrls = true;
+
+ // The RPC URL will be fetched from config or defaultRpcUrls if possible.
+ function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) {
+ require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string.");
+
+ initializeStdChains();
+ chain = chains[chainAlias];
+ require(
+ chain.chainId != 0,
+ string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found."))
+ );
+
+ chain = getChainWithUpdatedRpcUrl(chainAlias, chain);
+ }
+
+ function getChain(uint256 chainId) internal virtual returns (Chain memory chain) {
+ require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0.");
+ initializeStdChains();
+ string memory chainAlias = idToAlias[chainId];
+
+ chain = chains[chainAlias];
+
+ require(
+ chain.chainId != 0,
+ string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found."))
+ );
+
+ chain = getChainWithUpdatedRpcUrl(chainAlias, chain);
+ }
+
+ // set chain info, with priority to argument's rpcUrl field.
+ function setChain(string memory chainAlias, ChainData memory chain) internal virtual {
+ require(
+ bytes(chainAlias).length != 0,
+ "StdChains setChain(string,ChainData): Chain alias cannot be the empty string."
+ );
+
+ require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0.");
+
+ initializeStdChains();
+ string memory foundAlias = idToAlias[chain.chainId];
+
+ require(
+ bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)),
+ string(
+ abi.encodePacked(
+ "StdChains setChain(string,ChainData): Chain ID ",
+ vm.toString(chain.chainId),
+ " already used by \"",
+ foundAlias,
+ "\"."
+ )
+ )
+ );
+
+ uint256 oldChainId = chains[chainAlias].chainId;
+ delete idToAlias[oldChainId];
+
+ chains[chainAlias] =
+ Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl});
+ idToAlias[chain.chainId] = chainAlias;
+ }
+
+ // set chain info, with priority to argument's rpcUrl field.
+ function setChain(string memory chainAlias, Chain memory chain) internal virtual {
+ setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl}));
+ }
+
+ function _toUpper(string memory str) private pure returns (string memory) {
+ bytes memory strb = bytes(str);
+ bytes memory copy = new bytes(strb.length);
+ for (uint256 i = 0; i < strb.length; i++) {
+ bytes1 b = strb[i];
+ if (b >= 0x61 && b <= 0x7A) {
+ copy[i] = bytes1(uint8(b) - 32);
+ } else {
+ copy[i] = b;
+ }
+ }
+ return string(copy);
+ }
+
+ // lookup rpcUrl, in descending order of priority:
+ // current -> config (foundry.toml) -> environment variable -> default
+ function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain) private returns (Chain memory) {
+ if (bytes(chain.rpcUrl).length == 0) {
+ try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) {
+ chain.rpcUrl = configRpcUrl;
+ } catch (bytes memory err) {
+ string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL"));
+ if (fallbackToDefaultRpcUrls) {
+ chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]);
+ } else {
+ chain.rpcUrl = vm.envString(envName);
+ }
+ // distinguish 'not found' from 'cannot read'
+ bytes memory notFoundError =
+ abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias)));
+ if (keccak256(notFoundError) != keccak256(err) || bytes(chain.rpcUrl).length == 0) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ revert(add(32, err), mload(err))
+ }
+ }
+ }
+ }
+ return chain;
+ }
+
+ function setFallbackToDefaultRpcUrls(bool useDefault) internal {
+ fallbackToDefaultRpcUrls = useDefault;
+ }
+
+ function initializeStdChains() private {
+ if (stdChainsInitialized) return;
+
+ stdChainsInitialized = true;
+
+ // If adding an RPC here, make sure to test the default RPC URL in `testRpcs`
+ setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545"));
+ setChainWithDefaultRpcUrl(
+ "mainnet", ChainData("Mainnet", 1, "https://mainnet.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001")
+ );
+ setChainWithDefaultRpcUrl(
+ "goerli", ChainData("Goerli", 5, "https://goerli.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001")
+ );
+ setChainWithDefaultRpcUrl(
+ "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001")
+ );
+ setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io"));
+ setChainWithDefaultRpcUrl("optimism_goerli", ChainData("Optimism Goerli", 420, "https://goerli.optimism.io"));
+ setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc"));
+ setChainWithDefaultRpcUrl(
+ "arbitrum_one_goerli", ChainData("Arbitrum One Goerli", 421613, "https://goerli-rollup.arbitrum.io/rpc")
+ );
+ setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc"));
+ setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com"));
+ setChainWithDefaultRpcUrl(
+ "polygon_mumbai", ChainData("Polygon Mumbai", 80001, "https://rpc-mumbai.maticvigil.com")
+ );
+ setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc"));
+ setChainWithDefaultRpcUrl(
+ "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc")
+ );
+ setChainWithDefaultRpcUrl(
+ "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org")
+ );
+ setChainWithDefaultRpcUrl(
+ "bnb_smart_chain_testnet",
+ ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel")
+ );
+ setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com"));
+ }
+
+ // set chain info, with priority to chainAlias' rpc url in foundry.toml
+ function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private {
+ string memory rpcUrl = chain.rpcUrl;
+ defaultRpcUrls[chainAlias] = rpcUrl;
+ chain.rpcUrl = "";
+ setChain(chainAlias, chain);
+ chain.rpcUrl = rpcUrl; // restore argument
+ }
+}
diff --git a/election-guard/lib/forge-std/src/StdCheats.sol b/election-guard/lib/forge-std/src/StdCheats.sol
new file mode 100644
index 00000000..c1750c6d
--- /dev/null
+++ b/election-guard/lib/forge-std/src/StdCheats.sol
@@ -0,0 +1,676 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {StdStorage, stdStorage} from "./StdStorage.sol";
+import {Vm} from "./Vm.sol";
+import {console2} from "./console2.sol";
+
+abstract contract StdCheatsSafe {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ bool private gasMeteringOff;
+
+ // Data structures to parse Transaction objects from the broadcast artifact
+ // that conform to EIP1559. The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct RawTx1559 {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ // json value name = function
+ string functionSig;
+ bytes32 hash;
+ // json value name = tx
+ RawTx1559Detail txDetail;
+ // json value name = type
+ string opcode;
+ }
+
+ struct RawTx1559Detail {
+ AccessList[] accessList;
+ bytes data;
+ address from;
+ bytes gas;
+ bytes nonce;
+ address to;
+ bytes txType;
+ bytes value;
+ }
+
+ struct Tx1559 {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ string functionSig;
+ bytes32 hash;
+ Tx1559Detail txDetail;
+ string opcode;
+ }
+
+ struct Tx1559Detail {
+ AccessList[] accessList;
+ bytes data;
+ address from;
+ uint256 gas;
+ uint256 nonce;
+ address to;
+ uint256 txType;
+ uint256 value;
+ }
+
+ // Data structures to parse Transaction objects from the broadcast artifact
+ // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct TxLegacy {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ string functionSig;
+ string hash;
+ string opcode;
+ TxDetailLegacy transaction;
+ }
+
+ struct TxDetailLegacy {
+ AccessList[] accessList;
+ uint256 chainId;
+ bytes data;
+ address from;
+ uint256 gas;
+ uint256 gasPrice;
+ bytes32 hash;
+ uint256 nonce;
+ bytes1 opcode;
+ bytes32 r;
+ bytes32 s;
+ uint256 txType;
+ address to;
+ uint8 v;
+ uint256 value;
+ }
+
+ struct AccessList {
+ address accessAddress;
+ bytes32[] storageKeys;
+ }
+
+ // Data structures to parse Receipt objects from the broadcast artifact.
+ // The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct RawReceipt {
+ bytes32 blockHash;
+ bytes blockNumber;
+ address contractAddress;
+ bytes cumulativeGasUsed;
+ bytes effectiveGasPrice;
+ address from;
+ bytes gasUsed;
+ RawReceiptLog[] logs;
+ bytes logsBloom;
+ bytes status;
+ address to;
+ bytes32 transactionHash;
+ bytes transactionIndex;
+ }
+
+ struct Receipt {
+ bytes32 blockHash;
+ uint256 blockNumber;
+ address contractAddress;
+ uint256 cumulativeGasUsed;
+ uint256 effectiveGasPrice;
+ address from;
+ uint256 gasUsed;
+ ReceiptLog[] logs;
+ bytes logsBloom;
+ uint256 status;
+ address to;
+ bytes32 transactionHash;
+ uint256 transactionIndex;
+ }
+
+ // Data structures to parse the entire broadcast artifact, assuming the
+ // transactions conform to EIP1559.
+
+ struct EIP1559ScriptArtifact {
+ string[] libraries;
+ string path;
+ string[] pending;
+ Receipt[] receipts;
+ uint256 timestamp;
+ Tx1559[] transactions;
+ TxReturn[] txReturns;
+ }
+
+ struct RawEIP1559ScriptArtifact {
+ string[] libraries;
+ string path;
+ string[] pending;
+ RawReceipt[] receipts;
+ TxReturn[] txReturns;
+ uint256 timestamp;
+ RawTx1559[] transactions;
+ }
+
+ struct RawReceiptLog {
+ // json value = address
+ address logAddress;
+ bytes32 blockHash;
+ bytes blockNumber;
+ bytes data;
+ bytes logIndex;
+ bool removed;
+ bytes32[] topics;
+ bytes32 transactionHash;
+ bytes transactionIndex;
+ bytes transactionLogIndex;
+ }
+
+ struct ReceiptLog {
+ // json value = address
+ address logAddress;
+ bytes32 blockHash;
+ uint256 blockNumber;
+ bytes data;
+ uint256 logIndex;
+ bytes32[] topics;
+ uint256 transactionIndex;
+ uint256 transactionLogIndex;
+ bool removed;
+ }
+
+ struct TxReturn {
+ string internalType;
+ string value;
+ }
+
+ struct Account {
+ address addr;
+ uint256 key;
+ }
+
+ // Checks that `addr` is not blacklisted by token contracts that have a blacklist.
+ function assumeNoBlacklisted(address token, address addr) internal virtual {
+ // Nothing to check if `token` is not a contract.
+ uint256 tokenCodeSize;
+ assembly {
+ tokenCodeSize := extcodesize(token)
+ }
+ require(tokenCodeSize > 0, "StdCheats assumeNoBlacklisted(address,address): Token address is not a contract.");
+
+ bool success;
+ bytes memory returnData;
+
+ // 4-byte selector for `isBlacklisted(address)`, used by USDC.
+ (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr));
+ vm.assume(!success || abi.decode(returnData, (bool)) == false);
+
+ // 4-byte selector for `isBlackListed(address)`, used by USDT.
+ (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr));
+ vm.assume(!success || abi.decode(returnData, (bool)) == false);
+ }
+
+ function assumeNoPrecompiles(address addr) internal virtual {
+ // Assembly required since `block.chainid` was introduced in 0.8.0.
+ uint256 chainId;
+ assembly {
+ chainId := chainid()
+ }
+ assumeNoPrecompiles(addr, chainId);
+ }
+
+ function assumeNoPrecompiles(address addr, uint256 chainId) internal pure virtual {
+ // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific
+ // address), but the same rationale for excluding them applies so we include those too.
+
+ // These should be present on all EVM-compatible chains.
+ vm.assume(addr < address(0x1) || addr > address(0x9));
+
+ // forgefmt: disable-start
+ if (chainId == 10 || chainId == 420) {
+ // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21
+ vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800));
+ } else if (chainId == 42161 || chainId == 421613) {
+ // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains
+ vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068));
+ } else if (chainId == 43114 || chainId == 43113) {
+ // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59
+ vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff));
+ vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF));
+ vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff));
+ }
+ // forgefmt: disable-end
+ }
+
+ function readEIP1559ScriptArtifact(string memory path)
+ internal
+ view
+ virtual
+ returns (EIP1559ScriptArtifact memory)
+ {
+ string memory data = vm.readFile(path);
+ bytes memory parsedData = vm.parseJson(data);
+ RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact));
+ EIP1559ScriptArtifact memory artifact;
+ artifact.libraries = rawArtifact.libraries;
+ artifact.path = rawArtifact.path;
+ artifact.timestamp = rawArtifact.timestamp;
+ artifact.pending = rawArtifact.pending;
+ artifact.txReturns = rawArtifact.txReturns;
+ artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts);
+ artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions);
+ return artifact;
+ }
+
+ function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) {
+ Tx1559[] memory txs = new Tx1559[](rawTxs.length);
+ for (uint256 i; i < rawTxs.length; i++) {
+ txs[i] = rawToConvertedEIPTx1559(rawTxs[i]);
+ }
+ return txs;
+ }
+
+ function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) {
+ Tx1559 memory transaction;
+ transaction.arguments = rawTx.arguments;
+ transaction.contractName = rawTx.contractName;
+ transaction.functionSig = rawTx.functionSig;
+ transaction.hash = rawTx.hash;
+ transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail);
+ transaction.opcode = rawTx.opcode;
+ return transaction;
+ }
+
+ function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail)
+ internal
+ pure
+ virtual
+ returns (Tx1559Detail memory)
+ {
+ Tx1559Detail memory txDetail;
+ txDetail.data = rawDetail.data;
+ txDetail.from = rawDetail.from;
+ txDetail.to = rawDetail.to;
+ txDetail.nonce = _bytesToUint(rawDetail.nonce);
+ txDetail.txType = _bytesToUint(rawDetail.txType);
+ txDetail.value = _bytesToUint(rawDetail.value);
+ txDetail.gas = _bytesToUint(rawDetail.gas);
+ txDetail.accessList = rawDetail.accessList;
+ return txDetail;
+ }
+
+ function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) {
+ string memory deployData = vm.readFile(path);
+ bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions");
+ RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[]));
+ return rawToConvertedEIPTx1559s(rawTxs);
+ }
+
+ function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) {
+ string memory deployData = vm.readFile(path);
+ string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]"));
+ bytes memory parsedDeployData = vm.parseJson(deployData, key);
+ RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559));
+ return rawToConvertedEIPTx1559(rawTx);
+ }
+
+ // Analogous to readTransactions, but for receipts.
+ function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) {
+ string memory deployData = vm.readFile(path);
+ bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts");
+ RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[]));
+ return rawToConvertedReceipts(rawReceipts);
+ }
+
+ function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) {
+ string memory deployData = vm.readFile(path);
+ string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]"));
+ bytes memory parsedDeployData = vm.parseJson(deployData, key);
+ RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt));
+ return rawToConvertedReceipt(rawReceipt);
+ }
+
+ function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) {
+ Receipt[] memory receipts = new Receipt[](rawReceipts.length);
+ for (uint256 i; i < rawReceipts.length; i++) {
+ receipts[i] = rawToConvertedReceipt(rawReceipts[i]);
+ }
+ return receipts;
+ }
+
+ function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) {
+ Receipt memory receipt;
+ receipt.blockHash = rawReceipt.blockHash;
+ receipt.to = rawReceipt.to;
+ receipt.from = rawReceipt.from;
+ receipt.contractAddress = rawReceipt.contractAddress;
+ receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice);
+ receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed);
+ receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed);
+ receipt.status = _bytesToUint(rawReceipt.status);
+ receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex);
+ receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber);
+ receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs);
+ receipt.logsBloom = rawReceipt.logsBloom;
+ receipt.transactionHash = rawReceipt.transactionHash;
+ return receipt;
+ }
+
+ function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs)
+ internal
+ pure
+ virtual
+ returns (ReceiptLog[] memory)
+ {
+ ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length);
+ for (uint256 i; i < rawLogs.length; i++) {
+ logs[i].logAddress = rawLogs[i].logAddress;
+ logs[i].blockHash = rawLogs[i].blockHash;
+ logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber);
+ logs[i].data = rawLogs[i].data;
+ logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex);
+ logs[i].topics = rawLogs[i].topics;
+ logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex);
+ logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex);
+ logs[i].removed = rawLogs[i].removed;
+ }
+ return logs;
+ }
+
+ // Deploy a contract by fetching the contract bytecode from
+ // the artifacts directory
+ // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))`
+ function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) {
+ bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(0, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed.");
+ }
+
+ function deployCode(string memory what) internal virtual returns (address addr) {
+ bytes memory bytecode = vm.getCode(what);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(0, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string): Deployment failed.");
+ }
+
+ /// @dev deploy contract with value on construction
+ function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) {
+ bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(val, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed.");
+ }
+
+ function deployCode(string memory what, uint256 val) internal virtual returns (address addr) {
+ bytes memory bytecode = vm.getCode(what);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(val, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed.");
+ }
+
+ // creates a labeled address and the corresponding private key
+ function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) {
+ privateKey = uint256(keccak256(abi.encodePacked(name)));
+ addr = vm.addr(privateKey);
+ vm.label(addr, name);
+ }
+
+ // creates a labeled address
+ function makeAddr(string memory name) internal virtual returns (address addr) {
+ (addr,) = makeAddrAndKey(name);
+ }
+
+ // Destroys an account immediately, sending the balance to beneficiary.
+ // Destroying means: balance will be zero, code will be empty, and nonce will be 0
+ // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce
+ // only after tx ends, this will run immediately.
+ function destroyAccount(address who, address beneficiary) internal virtual {
+ uint256 currBalance = who.balance;
+ vm.etch(who, abi.encode());
+ vm.deal(who, 0);
+ vm.resetNonce(who);
+
+ uint256 beneficiaryBalance = beneficiary.balance;
+ vm.deal(beneficiary, currBalance + beneficiaryBalance);
+ }
+
+ // creates a struct containing both a labeled address and the corresponding private key
+ function makeAccount(string memory name) internal virtual returns (Account memory account) {
+ (account.addr, account.key) = makeAddrAndKey(name);
+ }
+
+ function deriveRememberKey(string memory mnemonic, uint32 index)
+ internal
+ virtual
+ returns (address who, uint256 privateKey)
+ {
+ privateKey = vm.deriveKey(mnemonic, index);
+ who = vm.rememberKey(privateKey);
+ }
+
+ function _bytesToUint(bytes memory b) private pure returns (uint256) {
+ require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32.");
+ return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));
+ }
+
+ function isFork() internal view virtual returns (bool status) {
+ try vm.activeFork() {
+ status = true;
+ } catch (bytes memory) {}
+ }
+
+ modifier skipWhenForking() {
+ if (!isFork()) {
+ _;
+ }
+ }
+
+ modifier skipWhenNotForking() {
+ if (isFork()) {
+ _;
+ }
+ }
+
+ modifier noGasMetering() {
+ vm.pauseGasMetering();
+ // To prevent turning gas monitoring back on with nested functions that use this modifier,
+ // we check if gasMetering started in the off position. If it did, we don't want to turn
+ // it back on until we exit the top level function that used the modifier
+ //
+ // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well.
+ // funcA will have `gasStartedOff` as false, funcB will have it as true,
+ // so we only turn metering back on at the end of the funcA
+ bool gasStartedOff = gasMeteringOff;
+ gasMeteringOff = true;
+
+ _;
+
+ // if gas metering was on when this modifier was called, turn it back on at the end
+ if (!gasStartedOff) {
+ gasMeteringOff = false;
+ vm.resumeGasMetering();
+ }
+ }
+
+ // a cheat for fuzzing addresses that are payable only
+ // see https://github.com/foundry-rs/foundry/issues/3631
+ function assumePayable(address addr) internal virtual {
+ (bool success,) = payable(addr).call{value: 0}("");
+ vm.assume(success);
+ }
+}
+
+// Wrappers around cheatcodes to avoid footguns
+abstract contract StdCheats is StdCheatsSafe {
+ using stdStorage for StdStorage;
+
+ StdStorage private stdstore;
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ // Skip forward or rewind time by the specified number of seconds
+ function skip(uint256 time) internal virtual {
+ vm.warp(block.timestamp + time);
+ }
+
+ function rewind(uint256 time) internal virtual {
+ vm.warp(block.timestamp - time);
+ }
+
+ // Setup a prank from an address that has some ether
+ function hoax(address msgSender) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.prank(msgSender);
+ }
+
+ function hoax(address msgSender, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.prank(msgSender);
+ }
+
+ function hoax(address msgSender, address origin) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.prank(msgSender, origin);
+ }
+
+ function hoax(address msgSender, address origin, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.prank(msgSender, origin);
+ }
+
+ // Start perpetual prank from an address that has some ether
+ function startHoax(address msgSender) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.startPrank(msgSender);
+ }
+
+ function startHoax(address msgSender, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.startPrank(msgSender);
+ }
+
+ // Start perpetual prank from an address that has some ether
+ // tx.origin is set to the origin parameter
+ function startHoax(address msgSender, address origin) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.startPrank(msgSender, origin);
+ }
+
+ function startHoax(address msgSender, address origin, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.startPrank(msgSender, origin);
+ }
+
+ function changePrank(address msgSender) internal virtual {
+ vm.stopPrank();
+ vm.startPrank(msgSender);
+ }
+
+ function changePrank(address msgSender, address txOrigin) internal virtual {
+ vm.stopPrank();
+ vm.startPrank(msgSender, txOrigin);
+ }
+
+ // The same as Vm's `deal`
+ // Use the alternative signature for ERC20 tokens
+ function deal(address to, uint256 give) internal virtual {
+ vm.deal(to, give);
+ }
+
+ // Set the balance of an account for any ERC20 token
+ // Use the alternative signature to update `totalSupply`
+ function deal(address token, address to, uint256 give) internal virtual {
+ deal(token, to, give, false);
+ }
+
+ // Set the balance of an account for any ERC1155 token
+ // Use the alternative signature to update `totalSupply`
+ function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual {
+ dealERC1155(token, to, id, give, false);
+ }
+
+ function deal(address token, address to, uint256 give, bool adjust) internal virtual {
+ // get current balance
+ (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));
+ uint256 prevBal = abi.decode(balData, (uint256));
+
+ // update balance
+ stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give);
+
+ // update total supply
+ if (adjust) {
+ (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd));
+ uint256 totSup = abi.decode(totSupData, (uint256));
+ if (give < prevBal) {
+ totSup -= (prevBal - give);
+ } else {
+ totSup += (give - prevBal);
+ }
+ stdstore.target(token).sig(0x18160ddd).checked_write(totSup);
+ }
+ }
+
+ function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual {
+ // get current balance
+ (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id));
+ uint256 prevBal = abi.decode(balData, (uint256));
+
+ // update balance
+ stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give);
+
+ // update total supply
+ if (adjust) {
+ (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id));
+ require(
+ totSupData.length != 0,
+ "StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply."
+ );
+ uint256 totSup = abi.decode(totSupData, (uint256));
+ if (give < prevBal) {
+ totSup -= (prevBal - give);
+ } else {
+ totSup += (give - prevBal);
+ }
+ stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup);
+ }
+ }
+
+ function dealERC721(address token, address to, uint256 id) internal virtual {
+ // check if token id is already minted and the actual owner.
+ (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id));
+ require(successMinted, "StdCheats deal(address,address,uint,bool): id not minted.");
+
+ // get owner current balance
+ (, bytes memory fromBalData) =
+ token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address))));
+ uint256 fromPrevBal = abi.decode(fromBalData, (uint256));
+
+ // get new user current balance
+ (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));
+ uint256 toPrevBal = abi.decode(toBalData, (uint256));
+
+ // update balances
+ stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal);
+ stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal);
+
+ // update owner
+ stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to);
+ }
+}
diff --git a/election-guard/lib/forge-std/src/StdError.sol b/election-guard/lib/forge-std/src/StdError.sol
new file mode 100644
index 00000000..a302191f
--- /dev/null
+++ b/election-guard/lib/forge-std/src/StdError.sol
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: MIT
+// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test
+pragma solidity >=0.6.2 <0.9.0;
+
+library stdError {
+ bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01);
+ bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11);
+ bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12);
+ bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21);
+ bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22);
+ bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31);
+ bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32);
+ bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41);
+ bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51);
+}
diff --git a/election-guard/lib/forge-std/src/StdInvariant.sol b/election-guard/lib/forge-std/src/StdInvariant.sol
new file mode 100644
index 00000000..efa1129e
--- /dev/null
+++ b/election-guard/lib/forge-std/src/StdInvariant.sol
@@ -0,0 +1,92 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+contract StdInvariant {
+ struct FuzzSelector {
+ address addr;
+ bytes4[] selectors;
+ }
+
+ address[] private _excludedContracts;
+ address[] private _excludedSenders;
+ address[] private _targetedContracts;
+ address[] private _targetedSenders;
+
+ string[] private _excludedArtifacts;
+ string[] private _targetedArtifacts;
+
+ FuzzSelector[] private _targetedArtifactSelectors;
+ FuzzSelector[] private _targetedSelectors;
+
+ // Functions for users:
+ // These are intended to be called in tests.
+
+ function excludeContract(address newExcludedContract_) internal {
+ _excludedContracts.push(newExcludedContract_);
+ }
+
+ function excludeSender(address newExcludedSender_) internal {
+ _excludedSenders.push(newExcludedSender_);
+ }
+
+ function excludeArtifact(string memory newExcludedArtifact_) internal {
+ _excludedArtifacts.push(newExcludedArtifact_);
+ }
+
+ function targetArtifact(string memory newTargetedArtifact_) internal {
+ _targetedArtifacts.push(newTargetedArtifact_);
+ }
+
+ function targetArtifactSelector(FuzzSelector memory newTargetedArtifactSelector_) internal {
+ _targetedArtifactSelectors.push(newTargetedArtifactSelector_);
+ }
+
+ function targetContract(address newTargetedContract_) internal {
+ _targetedContracts.push(newTargetedContract_);
+ }
+
+ function targetSelector(FuzzSelector memory newTargetedSelector_) internal {
+ _targetedSelectors.push(newTargetedSelector_);
+ }
+
+ function targetSender(address newTargetedSender_) internal {
+ _targetedSenders.push(newTargetedSender_);
+ }
+
+ // Functions for forge:
+ // These are called by forge to run invariant tests and don't need to be called in tests.
+
+ function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) {
+ excludedArtifacts_ = _excludedArtifacts;
+ }
+
+ function excludeContracts() public view returns (address[] memory excludedContracts_) {
+ excludedContracts_ = _excludedContracts;
+ }
+
+ function excludeSenders() public view returns (address[] memory excludedSenders_) {
+ excludedSenders_ = _excludedSenders;
+ }
+
+ function targetArtifacts() public view returns (string[] memory targetedArtifacts_) {
+ targetedArtifacts_ = _targetedArtifacts;
+ }
+
+ function targetArtifactSelectors() public view returns (FuzzSelector[] memory targetedArtifactSelectors_) {
+ targetedArtifactSelectors_ = _targetedArtifactSelectors;
+ }
+
+ function targetContracts() public view returns (address[] memory targetedContracts_) {
+ targetedContracts_ = _targetedContracts;
+ }
+
+ function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) {
+ targetedSelectors_ = _targetedSelectors;
+ }
+
+ function targetSenders() public view returns (address[] memory targetedSenders_) {
+ targetedSenders_ = _targetedSenders;
+ }
+}
diff --git a/election-guard/lib/forge-std/src/StdJson.sol b/election-guard/lib/forge-std/src/StdJson.sol
new file mode 100644
index 00000000..014e6b15
--- /dev/null
+++ b/election-guard/lib/forge-std/src/StdJson.sol
@@ -0,0 +1,179 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.0 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {VmSafe} from "./Vm.sol";
+
+// Helpers for parsing and writing JSON files
+// To parse:
+// ```
+// using stdJson for string;
+// string memory json = vm.readFile("some_peth");
+// json.parseUint("");
+// ```
+// To write:
+// ```
+// using stdJson for string;
+// string memory json = "deploymentArtifact";
+// Contract contract = new Contract();
+// json.serialize("contractAddress", address(contract));
+// json = json.serialize("deploymentTimes", uint(1));
+// // store the stringified JSON to the 'json' variable we have been using as a key
+// // as we won't need it any longer
+// string memory json2 = "finalArtifact";
+// string memory final = json2.serialize("depArtifact", json);
+// final.write("");
+// ```
+
+library stdJson {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) {
+ return vm.parseJson(json, key);
+ }
+
+ function readUint(string memory json, string memory key) internal returns (uint256) {
+ return vm.parseJsonUint(json, key);
+ }
+
+ function readUintArray(string memory json, string memory key) internal returns (uint256[] memory) {
+ return vm.parseJsonUintArray(json, key);
+ }
+
+ function readInt(string memory json, string memory key) internal returns (int256) {
+ return vm.parseJsonInt(json, key);
+ }
+
+ function readIntArray(string memory json, string memory key) internal returns (int256[] memory) {
+ return vm.parseJsonIntArray(json, key);
+ }
+
+ function readBytes32(string memory json, string memory key) internal returns (bytes32) {
+ return vm.parseJsonBytes32(json, key);
+ }
+
+ function readBytes32Array(string memory json, string memory key) internal returns (bytes32[] memory) {
+ return vm.parseJsonBytes32Array(json, key);
+ }
+
+ function readString(string memory json, string memory key) internal returns (string memory) {
+ return vm.parseJsonString(json, key);
+ }
+
+ function readStringArray(string memory json, string memory key) internal returns (string[] memory) {
+ return vm.parseJsonStringArray(json, key);
+ }
+
+ function readAddress(string memory json, string memory key) internal returns (address) {
+ return vm.parseJsonAddress(json, key);
+ }
+
+ function readAddressArray(string memory json, string memory key) internal returns (address[] memory) {
+ return vm.parseJsonAddressArray(json, key);
+ }
+
+ function readBool(string memory json, string memory key) internal returns (bool) {
+ return vm.parseJsonBool(json, key);
+ }
+
+ function readBoolArray(string memory json, string memory key) internal returns (bool[] memory) {
+ return vm.parseJsonBoolArray(json, key);
+ }
+
+ function readBytes(string memory json, string memory key) internal returns (bytes memory) {
+ return vm.parseJsonBytes(json, key);
+ }
+
+ function readBytesArray(string memory json, string memory key) internal returns (bytes[] memory) {
+ return vm.parseJsonBytesArray(json, key);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function write(string memory jsonKey, string memory path) internal {
+ vm.writeJson(jsonKey, path);
+ }
+
+ function write(string memory jsonKey, string memory path, string memory valueKey) internal {
+ vm.writeJson(jsonKey, path, valueKey);
+ }
+}
diff --git a/election-guard/lib/forge-std/src/StdMath.sol b/election-guard/lib/forge-std/src/StdMath.sol
new file mode 100644
index 00000000..459523bd
--- /dev/null
+++ b/election-guard/lib/forge-std/src/StdMath.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+library stdMath {
+ int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;
+
+ function abs(int256 a) internal pure returns (uint256) {
+ // Required or it will fail when `a = type(int256).min`
+ if (a == INT256_MIN) {
+ return 57896044618658097711785492504343953926634992332820282019728792003956564819968;
+ }
+
+ return uint256(a > 0 ? a : -a);
+ }
+
+ function delta(uint256 a, uint256 b) internal pure returns (uint256) {
+ return a > b ? a - b : b - a;
+ }
+
+ function delta(int256 a, int256 b) internal pure returns (uint256) {
+ // a and b are of the same sign
+ // this works thanks to two's complement, the left-most bit is the sign bit
+ if ((a ^ b) > -1) {
+ return delta(abs(a), abs(b));
+ }
+
+ // a and b are of opposite signs
+ return abs(a) + abs(b);
+ }
+
+ function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) {
+ uint256 absDelta = delta(a, b);
+
+ return absDelta * 1e18 / b;
+ }
+
+ function percentDelta(int256 a, int256 b) internal pure returns (uint256) {
+ uint256 absDelta = delta(a, b);
+ uint256 absB = abs(b);
+
+ return absDelta * 1e18 / absB;
+ }
+}
diff --git a/election-guard/lib/forge-std/src/StdStorage.sol b/election-guard/lib/forge-std/src/StdStorage.sol
new file mode 100644
index 00000000..73a5ceb9
--- /dev/null
+++ b/election-guard/lib/forge-std/src/StdStorage.sol
@@ -0,0 +1,327 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+import {Vm} from "./Vm.sol";
+
+struct StdStorage {
+ mapping(address => mapping(bytes4 => mapping(bytes32 => uint256))) slots;
+ mapping(address => mapping(bytes4 => mapping(bytes32 => bool))) finds;
+ bytes32[] _keys;
+ bytes4 _sig;
+ uint256 _depth;
+ address _target;
+ bytes32 _set;
+}
+
+library stdStorageSafe {
+ event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot);
+ event WARNING_UninitedSlot(address who, uint256 slot);
+
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function sigs(string memory sigStr) internal pure returns (bytes4) {
+ return bytes4(keccak256(bytes(sigStr)));
+ }
+
+ /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against
+ // slot complexity:
+ // if flat, will be bytes32(uint256(uint));
+ // if map, will be keccak256(abi.encode(key, uint(slot)));
+ // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))));
+ // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth);
+ function find(StdStorage storage self) internal returns (uint256) {
+ address who = self._target;
+ bytes4 fsig = self._sig;
+ uint256 field_depth = self._depth;
+ bytes32[] memory ins = self._keys;
+
+ // calldata to test against
+ if (self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]) {
+ return self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))];
+ }
+ bytes memory cald = abi.encodePacked(fsig, flatten(ins));
+ vm.record();
+ bytes32 fdat;
+ {
+ (, bytes memory rdat) = who.staticcall(cald);
+ fdat = bytesToBytes32(rdat, 32 * field_depth);
+ }
+
+ (bytes32[] memory reads,) = vm.accesses(address(who));
+ if (reads.length == 1) {
+ bytes32 curr = vm.load(who, reads[0]);
+ if (curr == bytes32(0)) {
+ emit WARNING_UninitedSlot(who, uint256(reads[0]));
+ }
+ if (fdat != curr) {
+ require(
+ false,
+ "stdStorage find(StdStorage): Packed slot. This would cause dangerous overwriting and currently isn't supported."
+ );
+ }
+ emit SlotFound(who, fsig, keccak256(abi.encodePacked(ins, field_depth)), uint256(reads[0]));
+ self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = uint256(reads[0]);
+ self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = true;
+ } else if (reads.length > 1) {
+ for (uint256 i = 0; i < reads.length; i++) {
+ bytes32 prev = vm.load(who, reads[i]);
+ if (prev == bytes32(0)) {
+ emit WARNING_UninitedSlot(who, uint256(reads[i]));
+ }
+ // store
+ vm.store(who, reads[i], bytes32(hex"1337"));
+ bool success;
+ bytes memory rdat;
+ {
+ (success, rdat) = who.staticcall(cald);
+ fdat = bytesToBytes32(rdat, 32 * field_depth);
+ }
+
+ if (success && fdat == bytes32(hex"1337")) {
+ // we found which of the slots is the actual one
+ emit SlotFound(who, fsig, keccak256(abi.encodePacked(ins, field_depth)), uint256(reads[i]));
+ self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = uint256(reads[i]);
+ self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = true;
+ vm.store(who, reads[i], prev);
+ break;
+ }
+ vm.store(who, reads[i], prev);
+ }
+ } else {
+ revert("stdStorage find(StdStorage): No storage use detected for target.");
+ }
+
+ require(
+ self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))],
+ "stdStorage find(StdStorage): Slot(s) not found."
+ );
+
+ delete self._target;
+ delete self._sig;
+ delete self._keys;
+ delete self._depth;
+
+ return self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))];
+ }
+
+ function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {
+ self._target = _target;
+ return self;
+ }
+
+ function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {
+ self._sig = _sig;
+ return self;
+ }
+
+ function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {
+ self._sig = sigs(_sig);
+ return self;
+ }
+
+ function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {
+ self._keys.push(bytes32(uint256(uint160(who))));
+ return self;
+ }
+
+ function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {
+ self._keys.push(bytes32(amt));
+ return self;
+ }
+
+ function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {
+ self._keys.push(key);
+ return self;
+ }
+
+ function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {
+ self._depth = _depth;
+ return self;
+ }
+
+ function read(StdStorage storage self) private returns (bytes memory) {
+ address t = self._target;
+ uint256 s = find(self);
+ return abi.encode(vm.load(t, bytes32(s)));
+ }
+
+ function read_bytes32(StdStorage storage self) internal returns (bytes32) {
+ return abi.decode(read(self), (bytes32));
+ }
+
+ function read_bool(StdStorage storage self) internal returns (bool) {
+ int256 v = read_int(self);
+ if (v == 0) return false;
+ if (v == 1) return true;
+ revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.");
+ }
+
+ function read_address(StdStorage storage self) internal returns (address) {
+ return abi.decode(read(self), (address));
+ }
+
+ function read_uint(StdStorage storage self) internal returns (uint256) {
+ return abi.decode(read(self), (uint256));
+ }
+
+ function read_int(StdStorage storage self) internal returns (int256) {
+ return abi.decode(read(self), (int256));
+ }
+
+ function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) {
+ bytes32 out;
+
+ uint256 max = b.length > 32 ? 32 : b.length;
+ for (uint256 i = 0; i < max; i++) {
+ out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);
+ }
+ return out;
+ }
+
+ function flatten(bytes32[] memory b) private pure returns (bytes memory) {
+ bytes memory result = new bytes(b.length * 32);
+ for (uint256 i = 0; i < b.length; i++) {
+ bytes32 k = b[i];
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(add(result, add(32, mul(32, i))), k)
+ }
+ }
+
+ return result;
+ }
+}
+
+library stdStorage {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function sigs(string memory sigStr) internal pure returns (bytes4) {
+ return stdStorageSafe.sigs(sigStr);
+ }
+
+ function find(StdStorage storage self) internal returns (uint256) {
+ return stdStorageSafe.find(self);
+ }
+
+ function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {
+ return stdStorageSafe.target(self, _target);
+ }
+
+ function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {
+ return stdStorageSafe.sig(self, _sig);
+ }
+
+ function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {
+ return stdStorageSafe.sig(self, _sig);
+ }
+
+ function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, who);
+ }
+
+ function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, amt);
+ }
+
+ function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, key);
+ }
+
+ function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {
+ return stdStorageSafe.depth(self, _depth);
+ }
+
+ function checked_write(StdStorage storage self, address who) internal {
+ checked_write(self, bytes32(uint256(uint160(who))));
+ }
+
+ function checked_write(StdStorage storage self, uint256 amt) internal {
+ checked_write(self, bytes32(amt));
+ }
+
+ function checked_write(StdStorage storage self, bool write) internal {
+ bytes32 t;
+ /// @solidity memory-safe-assembly
+ assembly {
+ t := write
+ }
+ checked_write(self, t);
+ }
+
+ function checked_write(StdStorage storage self, bytes32 set) internal {
+ address who = self._target;
+ bytes4 fsig = self._sig;
+ uint256 field_depth = self._depth;
+ bytes32[] memory ins = self._keys;
+
+ bytes memory cald = abi.encodePacked(fsig, flatten(ins));
+ if (!self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]) {
+ find(self);
+ }
+ bytes32 slot = bytes32(self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]);
+
+ bytes32 fdat;
+ {
+ (, bytes memory rdat) = who.staticcall(cald);
+ fdat = bytesToBytes32(rdat, 32 * field_depth);
+ }
+ bytes32 curr = vm.load(who, slot);
+
+ if (fdat != curr) {
+ require(
+ false,
+ "stdStorage find(StdStorage): Packed slot. This would cause dangerous overwriting and currently isn't supported."
+ );
+ }
+ vm.store(who, slot, set);
+ delete self._target;
+ delete self._sig;
+ delete self._keys;
+ delete self._depth;
+ }
+
+ function read_bytes32(StdStorage storage self) internal returns (bytes32) {
+ return stdStorageSafe.read_bytes32(self);
+ }
+
+ function read_bool(StdStorage storage self) internal returns (bool) {
+ return stdStorageSafe.read_bool(self);
+ }
+
+ function read_address(StdStorage storage self) internal returns (address) {
+ return stdStorageSafe.read_address(self);
+ }
+
+ function read_uint(StdStorage storage self) internal returns (uint256) {
+ return stdStorageSafe.read_uint(self);
+ }
+
+ function read_int(StdStorage storage self) internal returns (int256) {
+ return stdStorageSafe.read_int(self);
+ }
+
+ // Private function so needs to be copied over
+ function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) {
+ bytes32 out;
+
+ uint256 max = b.length > 32 ? 32 : b.length;
+ for (uint256 i = 0; i < max; i++) {
+ out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);
+ }
+ return out;
+ }
+
+ // Private function so needs to be copied over
+ function flatten(bytes32[] memory b) private pure returns (bytes memory) {
+ bytes memory result = new bytes(b.length * 32);
+ for (uint256 i = 0; i < b.length; i++) {
+ bytes32 k = b[i];
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(add(result, add(32, mul(32, i))), k)
+ }
+ }
+
+ return result;
+ }
+}
diff --git a/election-guard/lib/forge-std/src/StdStyle.sol b/election-guard/lib/forge-std/src/StdStyle.sol
new file mode 100644
index 00000000..46f4e81c
--- /dev/null
+++ b/election-guard/lib/forge-std/src/StdStyle.sol
@@ -0,0 +1,333 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.4.22 <0.9.0;
+
+import {Vm} from "./Vm.sol";
+
+library StdStyle {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ string constant RED = "\u001b[91m";
+ string constant GREEN = "\u001b[92m";
+ string constant YELLOW = "\u001b[93m";
+ string constant BLUE = "\u001b[94m";
+ string constant MAGENTA = "\u001b[95m";
+ string constant CYAN = "\u001b[96m";
+ string constant BOLD = "\u001b[1m";
+ string constant DIM = "\u001b[2m";
+ string constant ITALIC = "\u001b[3m";
+ string constant UNDERLINE = "\u001b[4m";
+ string constant INVERSE = "\u001b[7m";
+ string constant RESET = "\u001b[0m";
+
+ function styleConcat(string memory style, string memory self) private pure returns (string memory) {
+ return string(abi.encodePacked(style, self, RESET));
+ }
+
+ function red(string memory self) internal pure returns (string memory) {
+ return styleConcat(RED, self);
+ }
+
+ function red(uint256 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(int256 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(address self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(bool self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function redBytes(bytes memory self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function redBytes32(bytes32 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function green(string memory self) internal pure returns (string memory) {
+ return styleConcat(GREEN, self);
+ }
+
+ function green(uint256 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(int256 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(address self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(bool self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function greenBytes(bytes memory self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function greenBytes32(bytes32 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function yellow(string memory self) internal pure returns (string memory) {
+ return styleConcat(YELLOW, self);
+ }
+
+ function yellow(uint256 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(int256 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(address self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(bool self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellowBytes(bytes memory self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellowBytes32(bytes32 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function blue(string memory self) internal pure returns (string memory) {
+ return styleConcat(BLUE, self);
+ }
+
+ function blue(uint256 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(int256 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(address self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(bool self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blueBytes(bytes memory self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blueBytes32(bytes32 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function magenta(string memory self) internal pure returns (string memory) {
+ return styleConcat(MAGENTA, self);
+ }
+
+ function magenta(uint256 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(int256 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(address self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(bool self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magentaBytes(bytes memory self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magentaBytes32(bytes32 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function cyan(string memory self) internal pure returns (string memory) {
+ return styleConcat(CYAN, self);
+ }
+
+ function cyan(uint256 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(int256 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(address self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(bool self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyanBytes(bytes memory self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyanBytes32(bytes32 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function bold(string memory self) internal pure returns (string memory) {
+ return styleConcat(BOLD, self);
+ }
+
+ function bold(uint256 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(int256 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(address self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(bool self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function boldBytes(bytes memory self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function boldBytes32(bytes32 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function dim(string memory self) internal pure returns (string memory) {
+ return styleConcat(DIM, self);
+ }
+
+ function dim(uint256 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(int256 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(address self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(bool self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dimBytes(bytes memory self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dimBytes32(bytes32 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function italic(string memory self) internal pure returns (string memory) {
+ return styleConcat(ITALIC, self);
+ }
+
+ function italic(uint256 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(int256 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(address self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(bool self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italicBytes(bytes memory self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italicBytes32(bytes32 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function underline(string memory self) internal pure returns (string memory) {
+ return styleConcat(UNDERLINE, self);
+ }
+
+ function underline(uint256 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(int256 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(address self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(bool self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underlineBytes(bytes memory self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underlineBytes32(bytes32 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function inverse(string memory self) internal pure returns (string memory) {
+ return styleConcat(INVERSE, self);
+ }
+
+ function inverse(uint256 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(int256 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(address self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(bool self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverseBytes(bytes memory self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverseBytes32(bytes32 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+}
diff --git a/election-guard/lib/forge-std/src/StdUtils.sol b/election-guard/lib/forge-std/src/StdUtils.sol
new file mode 100644
index 00000000..d67025c6
--- /dev/null
+++ b/election-guard/lib/forge-std/src/StdUtils.sol
@@ -0,0 +1,198 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {IMulticall3} from "./interfaces/IMulticall3.sol";
+import {VmSafe} from "./Vm.sol";
+
+abstract contract StdUtils {
+ /*//////////////////////////////////////////////////////////////////////////
+ CONSTANTS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11);
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+ address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;
+ uint256 private constant INT256_MIN_ABS =
+ 57896044618658097711785492504343953926634992332820282019728792003956564819968;
+ uint256 private constant SECP256K1_ORDER =
+ 115792089237316195423570985008687907852837564279074904382605163141518161494337;
+ uint256 private constant UINT256_MAX =
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.
+ address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
+
+ /*//////////////////////////////////////////////////////////////////////////
+ INTERNAL FUNCTIONS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {
+ require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min.");
+ // If x is between min and max, return x directly. This is to ensure that dictionary values
+ // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188
+ if (x >= min && x <= max) return x;
+
+ uint256 size = max - min + 1;
+
+ // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side.
+ // This helps ensure coverage of the min/max values.
+ if (x <= 3 && size > x) return min + x;
+ if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x);
+
+ // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive.
+ if (x > max) {
+ uint256 diff = x - max;
+ uint256 rem = diff % size;
+ if (rem == 0) return max;
+ result = min + rem - 1;
+ } else if (x < min) {
+ uint256 diff = min - x;
+ uint256 rem = diff % size;
+ if (rem == 0) return min;
+ result = max - rem + 1;
+ }
+ }
+
+ function bound(uint256 x, uint256 min, uint256 max) internal view virtual returns (uint256 result) {
+ result = _bound(x, min, max);
+ console2_log("Bound Result", result);
+ }
+
+ function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {
+ require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min.");
+
+ // Shifting all int256 values to uint256 to use _bound function. The range of two types are:
+ // int256 : -(2**255) ~ (2**255 - 1)
+ // uint256: 0 ~ (2**256 - 1)
+ // So, add 2**255, INT256_MIN_ABS to the integer values.
+ //
+ // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow.
+ // So, use `~uint256(x) + 1` instead.
+ uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS);
+ uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS);
+ uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS);
+
+ uint256 y = _bound(_x, _min, _max);
+
+ // To move it back to int256 value, subtract INT256_MIN_ABS at here.
+ result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS);
+ }
+
+ function bound(int256 x, int256 min, int256 max) internal view virtual returns (int256 result) {
+ result = _bound(x, min, max);
+ console2_log("Bound result", vm.toString(result));
+ }
+
+ function boundPrivateKey(uint256 privateKey) internal view virtual returns (uint256 result) {
+ result = _bound(privateKey, 1, SECP256K1_ORDER - 1);
+ }
+
+ function bytesToUint(bytes memory b) internal pure virtual returns (uint256) {
+ require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32.");
+ return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));
+ }
+
+ /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce
+ /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol)
+ function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) {
+ // forgefmt: disable-start
+ // The integer zero is treated as an empty byte string, and as a result it only has a length prefix, 0x80, computed via 0x80 + 0.
+ // A one byte integer uses its own value as its length prefix, there is no additional "0x80 + length" prefix that comes before it.
+ if (nonce == 0x00) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, bytes1(0x80))));
+ if (nonce <= 0x7f) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, uint8(nonce))));
+
+ // Nonces greater than 1 byte all follow a consistent encoding scheme, where each value is preceded by a prefix of 0x80 + length.
+ if (nonce <= 2**8 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd7), bytes1(0x94), deployer, bytes1(0x81), uint8(nonce))));
+ if (nonce <= 2**16 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd8), bytes1(0x94), deployer, bytes1(0x82), uint16(nonce))));
+ if (nonce <= 2**24 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd9), bytes1(0x94), deployer, bytes1(0x83), uint24(nonce))));
+ // forgefmt: disable-end
+
+ // More details about RLP encoding can be found here: https://eth.wiki/fundamentals/rlp
+ // 0xda = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x84 ++ nonce)
+ // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex)
+ // 0x84 = 0x80 + 0x04 (0x04 = the bytes length of the nonce, 4 bytes, in hex)
+ // We assume nobody can have a nonce large enough to require more than 32 bytes.
+ return addressFromLast20Bytes(
+ keccak256(abi.encodePacked(bytes1(0xda), bytes1(0x94), deployer, bytes1(0x84), uint32(nonce)))
+ );
+ }
+
+ function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer)
+ internal
+ pure
+ virtual
+ returns (address)
+ {
+ return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, initcodeHash)));
+ }
+
+ /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer
+ function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) {
+ return computeCreate2Address(salt, initCodeHash, CREATE2_FACTORY);
+ }
+
+ /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments
+ /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode
+ function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) {
+ return hashInitCode(creationCode, "");
+ }
+
+ /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2
+ /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode
+ /// @param args the ABI-encoded arguments to the constructor of C
+ function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) {
+ return keccak256(abi.encodePacked(creationCode, args));
+ }
+
+ // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses.
+ function getTokenBalances(address token, address[] memory addresses)
+ internal
+ virtual
+ returns (uint256[] memory balances)
+ {
+ uint256 tokenCodeSize;
+ assembly {
+ tokenCodeSize := extcodesize(token)
+ }
+ require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract.");
+
+ // ABI encode the aggregate call to Multicall3.
+ uint256 length = addresses.length;
+ IMulticall3.Call[] memory calls = new IMulticall3.Call[](length);
+ for (uint256 i = 0; i < length; ++i) {
+ // 0x70a08231 = bytes4("balanceOf(address)"))
+ calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))});
+ }
+
+ // Make the aggregate call.
+ (, bytes[] memory returnData) = multicall.aggregate(calls);
+
+ // ABI decode the return data and return the balances.
+ balances = new uint256[](length);
+ for (uint256 i = 0; i < length; ++i) {
+ balances[i] = abi.decode(returnData[i], (uint256));
+ }
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ PRIVATE FUNCTIONS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) {
+ return address(uint160(uint256(bytesValue)));
+ }
+
+ // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere.
+
+ function console2_log(string memory p0, uint256 p1) private view {
+ (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string,uint256)", p0, p1));
+ status;
+ }
+
+ function console2_log(string memory p0, string memory p1) private view {
+ (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string,string)", p0, p1));
+ status;
+ }
+}
diff --git a/election-guard/lib/forge-std/src/Test.sol b/election-guard/lib/forge-std/src/Test.sol
new file mode 100644
index 00000000..9ff5cb8d
--- /dev/null
+++ b/election-guard/lib/forge-std/src/Test.sol
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+// 💬 ABOUT
+// Standard Library's default Test
+
+// 🧩 MODULES
+import {console} from "./console.sol";
+import {console2} from "./console2.sol";
+import {StdAssertions} from "./StdAssertions.sol";
+import {StdChains} from "./StdChains.sol";
+import {StdCheats} from "./StdCheats.sol";
+import {stdError} from "./StdError.sol";
+import {StdInvariant} from "./StdInvariant.sol";
+import {stdJson} from "./StdJson.sol";
+import {stdMath} from "./StdMath.sol";
+import {StdStorage, stdStorage} from "./StdStorage.sol";
+import {StdUtils} from "./StdUtils.sol";
+import {Vm} from "./Vm.sol";
+import {StdStyle} from "./StdStyle.sol";
+
+// 📦 BOILERPLATE
+import {TestBase} from "./Base.sol";
+import {DSTest} from "ds-test/test.sol";
+
+// ⭐️ TEST
+abstract contract Test is DSTest, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils, TestBase {
+// Note: IS_TEST() must return true.
+// Note: Must have failure system, https://github.com/dapphub/ds-test/blob/cd98eff28324bfac652e63a239a60632a761790b/src/test.sol#L39-L76.
+}
diff --git a/election-guard/lib/forge-std/src/Vm.sol b/election-guard/lib/forge-std/src/Vm.sol
new file mode 100644
index 00000000..f919e6db
--- /dev/null
+++ b/election-guard/lib/forge-std/src/Vm.sol
@@ -0,0 +1,502 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+// Cheatcodes are marked as view/pure/none using the following rules:
+// 0. A call's observable behaviour includes its return value, logs, reverts and state writes,
+// 1. If you can influence a later call's observable behaviour, you're neither `view` nor `pure (you are modifying some state be it the EVM, interpreter, filesystem, etc),
+// 2. Otherwise if you can be influenced by an earlier call, or if reading some state, you're `view`,
+// 3. Otherwise you're `pure`.
+
+interface VmSafe {
+ struct Log {
+ bytes32[] topics;
+ bytes data;
+ address emitter;
+ }
+
+ struct Rpc {
+ string key;
+ string url;
+ }
+
+ struct DirEntry {
+ string errorMessage;
+ string path;
+ uint64 depth;
+ bool isDir;
+ bool isSymlink;
+ }
+
+ struct FsMetadata {
+ bool isDir;
+ bool isSymlink;
+ uint256 length;
+ bool readOnly;
+ uint256 modified;
+ uint256 accessed;
+ uint256 created;
+ }
+
+ // Loads a storage slot from an address
+ function load(address target, bytes32 slot) external view returns (bytes32 data);
+ // Signs data
+ function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
+ // Gets the address for a given private key
+ function addr(uint256 privateKey) external pure returns (address keyAddr);
+ // Gets the nonce of an account
+ function getNonce(address account) external view returns (uint64 nonce);
+ // Performs a foreign function call via the terminal
+ function ffi(string[] calldata commandInput) external returns (bytes memory result);
+ // Sets environment variables
+ function setEnv(string calldata name, string calldata value) external;
+ // Reads environment variables, (name) => (value)
+ function envBool(string calldata name) external view returns (bool value);
+ function envUint(string calldata name) external view returns (uint256 value);
+ function envInt(string calldata name) external view returns (int256 value);
+ function envAddress(string calldata name) external view returns (address value);
+ function envBytes32(string calldata name) external view returns (bytes32 value);
+ function envString(string calldata name) external view returns (string memory value);
+ function envBytes(string calldata name) external view returns (bytes memory value);
+ // Reads environment variables as arrays
+ function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value);
+ function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value);
+ function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value);
+ function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value);
+ function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value);
+ function envString(string calldata name, string calldata delim) external view returns (string[] memory value);
+ function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value);
+ // Read environment variables with default value
+ function envOr(string calldata name, bool defaultValue) external returns (bool value);
+ function envOr(string calldata name, uint256 defaultValue) external returns (uint256 value);
+ function envOr(string calldata name, int256 defaultValue) external returns (int256 value);
+ function envOr(string calldata name, address defaultValue) external returns (address value);
+ function envOr(string calldata name, bytes32 defaultValue) external returns (bytes32 value);
+ function envOr(string calldata name, string calldata defaultValue) external returns (string memory value);
+ function envOr(string calldata name, bytes calldata defaultValue) external returns (bytes memory value);
+ // Read environment variables as arrays with default value
+ function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue)
+ external
+ returns (bool[] memory value);
+ function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue)
+ external
+ returns (uint256[] memory value);
+ function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue)
+ external
+ returns (int256[] memory value);
+ function envOr(string calldata name, string calldata delim, address[] calldata defaultValue)
+ external
+ returns (address[] memory value);
+ function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue)
+ external
+ returns (bytes32[] memory value);
+ function envOr(string calldata name, string calldata delim, string[] calldata defaultValue)
+ external
+ returns (string[] memory value);
+ function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue)
+ external
+ returns (bytes[] memory value);
+ // Records all storage reads and writes
+ function record() external;
+ // Gets all accessed reads and write slot from a recording session, for a given address
+ function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots);
+ // Gets the _creation_ bytecode from an artifact file. Takes in the relative path to the json file
+ function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode);
+ // Gets the _deployed_ bytecode from an artifact file. Takes in the relative path to the json file
+ function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode);
+ // Labels an address in call traces
+ function label(address account, string calldata newLabel) external;
+ // Gets the label for the specified address
+ function getLabel(address account) external returns (string memory label);
+ // Using the address that calls the test contract, has the next call (at this call depth only) create a transaction that can later be signed and sent onchain
+ function broadcast() external;
+ // Has the next call (at this call depth only) create a transaction with the address provided as the sender that can later be signed and sent onchain
+ function broadcast(address signer) external;
+ // Has the next call (at this call depth only) create a transaction with the private key provided as the sender that can later be signed and sent onchain
+ function broadcast(uint256 privateKey) external;
+ // Using the address that calls the test contract, has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain
+ function startBroadcast() external;
+ // Has all subsequent calls (at this call depth only) create transactions with the address provided that can later be signed and sent onchain
+ function startBroadcast(address signer) external;
+ // Has all subsequent calls (at this call depth only) create transactions with the private key provided that can later be signed and sent onchain
+ function startBroadcast(uint256 privateKey) external;
+ // Stops collecting onchain transactions
+ function stopBroadcast() external;
+
+ // Get the path of the current project root.
+ function projectRoot() external view returns (string memory path);
+ // Reads the entire content of file to string. `path` is relative to the project root.
+ function readFile(string calldata path) external view returns (string memory data);
+ // Reads the entire content of file as binary. `path` is relative to the project root.
+ function readFileBinary(string calldata path) external view returns (bytes memory data);
+ // Reads next line of file to string.
+ function readLine(string calldata path) external view returns (string memory line);
+ // Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does.
+ // `path` is relative to the project root.
+ function writeFile(string calldata path, string calldata data) external;
+ // Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does.
+ // `path` is relative to the project root.
+ function writeFileBinary(string calldata path, bytes calldata data) external;
+ // Writes line to file, creating a file if it does not exist.
+ // `path` is relative to the project root.
+ function writeLine(string calldata path, string calldata data) external;
+ // Closes file for reading, resetting the offset and allowing to read it from beginning with readLine.
+ // `path` is relative to the project root.
+ function closeFile(string calldata path) external;
+ // Removes a file from the filesystem.
+ // This cheatcode will revert in the following situations, but is not limited to just these cases:
+ // - `path` points to a directory.
+ // - The file doesn't exist.
+ // - The user lacks permissions to remove the file.
+ // `path` is relative to the project root.
+ function removeFile(string calldata path) external;
+ // Creates a new, empty directory at the provided path.
+ // This cheatcode will revert in the following situations, but is not limited to just these cases:
+ // - User lacks permissions to modify `path`.
+ // - A parent of the given path doesn't exist and `recursive` is false.
+ // - `path` already exists and `recursive` is false.
+ // `path` is relative to the project root.
+ function createDir(string calldata path, bool recursive) external;
+ // Removes a directory at the provided path.
+ // This cheatcode will revert in the following situations, but is not limited to just these cases:
+ // - `path` doesn't exist.
+ // - `path` isn't a directory.
+ // - User lacks permissions to modify `path`.
+ // - The directory is not empty and `recursive` is false.
+ // `path` is relative to the project root.
+ function removeDir(string calldata path, bool recursive) external;
+ // Reads the directory at the given path recursively, up to `max_depth`.
+ // `max_depth` defaults to 1, meaning only the direct children of the given directory will be returned.
+ // Follows symbolic links if `follow_links` is true.
+ function readDir(string calldata path) external view returns (DirEntry[] memory entries);
+ function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries);
+ function readDir(string calldata path, uint64 maxDepth, bool followLinks)
+ external
+ view
+ returns (DirEntry[] memory entries);
+ // Reads a symbolic link, returning the path that the link points to.
+ // This cheatcode will revert in the following situations, but is not limited to just these cases:
+ // - `path` is not a symbolic link.
+ // - `path` does not exist.
+ function readLink(string calldata linkPath) external view returns (string memory targetPath);
+ // Given a path, query the file system to get information about a file, directory, etc.
+ function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata);
+
+ // Convert values to a string
+ function toString(address value) external pure returns (string memory stringifiedValue);
+ function toString(bytes calldata value) external pure returns (string memory stringifiedValue);
+ function toString(bytes32 value) external pure returns (string memory stringifiedValue);
+ function toString(bool value) external pure returns (string memory stringifiedValue);
+ function toString(uint256 value) external pure returns (string memory stringifiedValue);
+ function toString(int256 value) external pure returns (string memory stringifiedValue);
+ // Convert values from a string
+ function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue);
+ function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue);
+ function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue);
+ function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue);
+ function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue);
+ function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue);
+ // Record all the transaction logs
+ function recordLogs() external;
+ // Gets all the recorded logs
+ function getRecordedLogs() external returns (Log[] memory logs);
+ // Derive a private key from a provided mnenomic string (or mnenomic file path) at the derivation path m/44'/60'/0'/0/{index}
+ function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey);
+ // Derive a private key from a provided mnenomic string (or mnenomic file path) at {derivationPath}{index}
+ function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index)
+ external
+ pure
+ returns (uint256 privateKey);
+ // Adds a private key to the local forge wallet and returns the address
+ function rememberKey(uint256 privateKey) external returns (address keyAddr);
+ //
+ // parseJson
+ //
+ // ----
+ // In case the returned value is a JSON object, it's encoded as a ABI-encoded tuple. As JSON objects
+ // don't have the notion of ordered, but tuples do, they JSON object is encoded with it's fields ordered in
+ // ALPHABETICAL order. That means that in order to successfully decode the tuple, we need to define a tuple that
+ // encodes the fields in the same order, which is alphabetical. In the case of Solidity structs, they are encoded
+ // as tuples, with the attributes in the order in which they are defined.
+ // For example: json = { 'a': 1, 'b': 0xa4tb......3xs}
+ // a: uint256
+ // b: address
+ // To decode that json, we need to define a struct or a tuple as follows:
+ // struct json = { uint256 a; address b; }
+ // If we defined a json struct with the opposite order, meaning placing the address b first, it would try to
+ // decode the tuple in that order, and thus fail.
+ // ----
+ // Given a string of JSON, return it as ABI-encoded
+ function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData);
+ function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData);
+
+ // The following parseJson cheatcodes will do type coercion, for the type that they indicate.
+ // For example, parseJsonUint will coerce all values to a uint256. That includes stringified numbers '12'
+ // and hex numbers '0xEF'.
+ // Type coercion works ONLY for discrete values or arrays. That means that the key must return a value or array, not
+ // a JSON object.
+ function parseJsonUint(string calldata, string calldata) external returns (uint256);
+ function parseJsonUintArray(string calldata, string calldata) external returns (uint256[] memory);
+ function parseJsonInt(string calldata, string calldata) external returns (int256);
+ function parseJsonIntArray(string calldata, string calldata) external returns (int256[] memory);
+ function parseJsonBool(string calldata, string calldata) external returns (bool);
+ function parseJsonBoolArray(string calldata, string calldata) external returns (bool[] memory);
+ function parseJsonAddress(string calldata, string calldata) external returns (address);
+ function parseJsonAddressArray(string calldata, string calldata) external returns (address[] memory);
+ function parseJsonString(string calldata, string calldata) external returns (string memory);
+ function parseJsonStringArray(string calldata, string calldata) external returns (string[] memory);
+ function parseJsonBytes(string calldata, string calldata) external returns (bytes memory);
+ function parseJsonBytesArray(string calldata, string calldata) external returns (bytes[] memory);
+ function parseJsonBytes32(string calldata, string calldata) external returns (bytes32);
+ function parseJsonBytes32Array(string calldata, string calldata) external returns (bytes32[] memory);
+
+ // Serialize a key and value to a JSON object stored in-memory that can be later written to a file
+ // It returns the stringified version of the specific JSON file up to that moment.
+ function serializeBool(string calldata objectKey, string calldata valueKey, bool value)
+ external
+ returns (string memory json);
+ function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value)
+ external
+ returns (string memory json);
+ function serializeInt(string calldata objectKey, string calldata valueKey, int256 value)
+ external
+ returns (string memory json);
+ function serializeAddress(string calldata objectKey, string calldata valueKey, address value)
+ external
+ returns (string memory json);
+ function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value)
+ external
+ returns (string memory json);
+ function serializeString(string calldata objectKey, string calldata valueKey, string calldata value)
+ external
+ returns (string memory json);
+ function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value)
+ external
+ returns (string memory json);
+
+ function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values)
+ external
+ returns (string memory json);
+ function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values)
+ external
+ returns (string memory json);
+ function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values)
+ external
+ returns (string memory json);
+ function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values)
+ external
+ returns (string memory json);
+ function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values)
+ external
+ returns (string memory json);
+ function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values)
+ external
+ returns (string memory json);
+ function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values)
+ external
+ returns (string memory json);
+
+ //
+ // writeJson
+ //
+ // ----
+ // Write a serialized JSON object to a file. If the file exists, it will be overwritten.
+ // Let's assume we want to write the following JSON to a file:
+ //
+ // { "boolean": true, "number": 342, "object": { "title": "finally json serialization" } }
+ //
+ // ```
+ // string memory json1 = "some key";
+ // vm.serializeBool(json1, "boolean", true);
+ // vm.serializeBool(json1, "number", uint256(342));
+ // json2 = "some other key";
+ // string memory output = vm.serializeString(json2, "title", "finally json serialization");
+ // string memory finalJson = vm.serialize(json1, "object", output);
+ // vm.writeJson(finalJson, "./output/example.json");
+ // ```
+ // The critical insight is that every invocation of serialization will return the stringified version of the JSON
+ // up to that point. That means we can construct arbitrary JSON objects and then use the return stringified version
+ // to serialize them as values to another JSON object.
+ //
+ // json1 and json2 are simply keys used by the backend to keep track of the objects. So vm.serializeJson(json1,..)
+ // will find the object in-memory that is keyed by "some key".
+ function writeJson(string calldata json, string calldata path) external;
+ // Write a serialized JSON object to an **existing** JSON file, replacing a value with key =
+ // This is useful to replace a specific value of a JSON file, without having to parse the entire thing
+ function writeJson(string calldata json, string calldata path, string calldata valueKey) external;
+ // Returns the RPC url for the given alias
+ function rpcUrl(string calldata rpcAlias) external view returns (string memory json);
+ // Returns all rpc urls and their aliases `[alias, url][]`
+ function rpcUrls() external view returns (string[2][] memory urls);
+ // Returns all rpc urls and their aliases as structs.
+ function rpcUrlStructs() external view returns (Rpc[] memory urls);
+ // If the condition is false, discard this run's fuzz inputs and generate new ones.
+ function assume(bool condition) external pure;
+ // Pauses gas metering (i.e. gas usage is not counted). Noop if already paused.
+ function pauseGasMetering() external;
+ // Resumes gas metering (i.e. gas usage is counted again). Noop if already on.
+ function resumeGasMetering() external;
+ // Writes a breakpoint to jump to in the debugger
+ function breakpoint(string calldata char) external;
+ // Writes a conditional breakpoint to jump to in the debugger
+ function breakpoint(string calldata char, bool value) external;
+}
+
+interface Vm is VmSafe {
+ // Sets block.timestamp
+ function warp(uint256 newTimestamp) external;
+ // Sets block.height
+ function roll(uint256 newHeight) external;
+ // Sets block.basefee
+ function fee(uint256 newBasefee) external;
+ // Sets block.difficulty
+ // Not available on EVM versions from Paris onwards. Use `prevrandao` instead.
+ // If used on unsupported EVM versions it will revert.
+ function difficulty(uint256 newDifficulty) external;
+ // Sets block.prevrandao
+ // Not available on EVM versions before Paris. Use `difficulty` instead.
+ // If used on unsupported EVM versions it will revert.
+ function prevrandao(bytes32 newPrevrandao) external;
+ // Sets block.chainid
+ function chainId(uint256 newChainId) external;
+ // Sets tx.gasprice
+ function txGasPrice(uint256 newGasPrice) external;
+ // Stores a value to an address' storage slot.
+ function store(address target, bytes32 slot, bytes32 value) external;
+ // Sets the nonce of an account; must be higher than the current nonce of the account
+ function setNonce(address account, uint64 newNonce) external;
+ // Sets the nonce of an account to an arbitrary value
+ function setNonceUnsafe(address account, uint64 newNonce) external;
+ // Resets the nonce of an account to 0 for EOAs and 1 for contract accounts
+ function resetNonce(address account) external;
+ // Sets the *next* call's msg.sender to be the input address
+ function prank(address msgSender) external;
+ // Sets all subsequent calls' msg.sender to be the input address until `stopPrank` is called
+ function startPrank(address msgSender) external;
+ // Sets the *next* call's msg.sender to be the input address, and the tx.origin to be the second input
+ function prank(address msgSender, address txOrigin) external;
+ // Sets all subsequent calls' msg.sender to be the input address until `stopPrank` is called, and the tx.origin to be the second input
+ function startPrank(address msgSender, address txOrigin) external;
+ // Resets subsequent calls' msg.sender to be `address(this)`
+ function stopPrank() external;
+ // Sets an address' balance
+ function deal(address account, uint256 newBalance) external;
+ // Sets an address' code
+ function etch(address target, bytes calldata newRuntimeBytecode) external;
+ // Expects an error on next call
+ function expectRevert(bytes calldata revertData) external;
+ function expectRevert(bytes4 revertData) external;
+ function expectRevert() external;
+
+ // Prepare an expected log with all four checks enabled.
+ // Call this function, then emit an event, then call a function. Internally after the call, we check if
+ // logs were emitted in the expected order with the expected topics and data.
+ // Second form also checks supplied address against emitting contract.
+ function expectEmit() external;
+ function expectEmit(address emitter) external;
+
+ // Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData).
+ // Call this function, then emit an event, then call a function. Internally after the call, we check if
+ // logs were emitted in the expected order with the expected topics and data (as specified by the booleans).
+ // Second form also checks supplied address against emitting contract.
+ function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external;
+ function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter)
+ external;
+
+ // Mocks a call to an address, returning specified data.
+ // Calldata can either be strict or a partial match, e.g. if you only
+ // pass a Solidity selector to the expected calldata, then the entire Solidity
+ // function will be mocked.
+ function mockCall(address callee, bytes calldata data, bytes calldata returnData) external;
+ // Mocks a call to an address with a specific msg.value, returning specified data.
+ // Calldata match takes precedence over msg.value in case of ambiguity.
+ function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external;
+ // Reverts a call to an address with specified revert data.
+ function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external;
+ // Reverts a call to an address with a specific msg.value, with specified revert data.
+ function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData)
+ external;
+ // Clears all mocked calls
+ function clearMockedCalls() external;
+ // Expects a call to an address with the specified calldata.
+ // Calldata can either be a strict or a partial match
+ function expectCall(address callee, bytes calldata data) external;
+ // Expects given number of calls to an address with the specified calldata.
+ function expectCall(address callee, bytes calldata data, uint64 count) external;
+ // Expects a call to an address with the specified msg.value and calldata
+ function expectCall(address callee, uint256 msgValue, bytes calldata data) external;
+ // Expects given number of calls to an address with the specified msg.value and calldata
+ function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external;
+ // Expect a call to an address with the specified msg.value, gas, and calldata.
+ function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external;
+ // Expects given number of calls to an address with the specified msg.value, gas, and calldata.
+ function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external;
+ // Expect a call to an address with the specified msg.value and calldata, and a *minimum* amount of gas.
+ function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external;
+ // Expect given number of calls to an address with the specified msg.value and calldata, and a *minimum* amount of gas.
+ function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count)
+ external;
+ // Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other
+ // memory is written to, the test will fail. Can be called multiple times to add more ranges to the set.
+ function expectSafeMemory(uint64 min, uint64 max) external;
+ // Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext.
+ // If any other memory is written to, the test will fail. Can be called multiple times to add more ranges
+ // to the set.
+ function expectSafeMemoryCall(uint64 min, uint64 max) external;
+ // Sets block.coinbase
+ function coinbase(address newCoinbase) external;
+ // Snapshot the current state of the evm.
+ // Returns the id of the snapshot that was created.
+ // To revert a snapshot use `revertTo`
+ function snapshot() external returns (uint256 snapshotId);
+ // Revert the state of the EVM to a previous snapshot
+ // Takes the snapshot id to revert to.
+ // This deletes the snapshot and all snapshots taken after the given snapshot id.
+ function revertTo(uint256 snapshotId) external returns (bool success);
+ // Creates a new fork with the given endpoint and block and returns the identifier of the fork
+ function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);
+ // Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork
+ function createFork(string calldata urlOrAlias) external returns (uint256 forkId);
+ // Creates a new fork with the given endpoint and at the block the given transaction was mined in, replays all transaction mined in the block before the transaction,
+ // and returns the identifier of the fork
+ function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);
+ // Creates _and_ also selects a new fork with the given endpoint and block and returns the identifier of the fork
+ function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);
+ // Creates _and_ also selects new fork with the given endpoint and at the block the given transaction was mined in, replays all transaction mined in the block before
+ // the transaction, returns the identifier of the fork
+ function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);
+ // Creates _and_ also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork
+ function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId);
+ // Takes a fork identifier created by `createFork` and sets the corresponding forked state as active.
+ function selectFork(uint256 forkId) external;
+ /// Returns the identifier of the currently active fork. Reverts if no fork is currently active.
+ function activeFork() external view returns (uint256 forkId);
+ // Updates the currently active fork to given block number
+ // This is similar to `roll` but for the currently active fork
+ function rollFork(uint256 blockNumber) external;
+ // Updates the currently active fork to given transaction
+ // this will `rollFork` with the number of the block the transaction was mined in and replays all transaction mined before it in the block
+ function rollFork(bytes32 txHash) external;
+ // Updates the given fork to given block number
+ function rollFork(uint256 forkId, uint256 blockNumber) external;
+ // Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block
+ function rollFork(uint256 forkId, bytes32 txHash) external;
+ // Marks that the account(s) should use persistent storage across fork swaps in a multifork setup
+ // Meaning, changes made to the state of this account will be kept when switching forks
+ function makePersistent(address account) external;
+ function makePersistent(address account0, address account1) external;
+ function makePersistent(address account0, address account1, address account2) external;
+ function makePersistent(address[] calldata accounts) external;
+ // Revokes persistent status from the address, previously added via `makePersistent`
+ function revokePersistent(address account) external;
+ function revokePersistent(address[] calldata accounts) external;
+ // Returns true if the account is marked as persistent
+ function isPersistent(address account) external view returns (bool persistent);
+ // In forking mode, explicitly grant the given address cheatcode access
+ function allowCheatcodes(address account) external;
+ // Fetches the given transaction from the active fork and executes it on the current state
+ function transact(bytes32 txHash) external;
+ // Fetches the given transaction from the given fork and executes it on the current state
+ function transact(uint256 forkId, bytes32 txHash) external;
+}
diff --git a/election-guard/lib/forge-std/src/console.sol b/election-guard/lib/forge-std/src/console.sol
new file mode 100644
index 00000000..ad57e536
--- /dev/null
+++ b/election-guard/lib/forge-std/src/console.sol
@@ -0,0 +1,1533 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.4.22 <0.9.0;
+
+library console {
+ address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
+
+ function _sendLogPayload(bytes memory payload) private view {
+ uint256 payloadLength = payload.length;
+ address consoleAddress = CONSOLE_ADDRESS;
+ /// @solidity memory-safe-assembly
+ assembly {
+ let payloadStart := add(payload, 32)
+ let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
+ }
+ }
+
+ function log() internal view {
+ _sendLogPayload(abi.encodeWithSignature("log()"));
+ }
+
+ function logInt(int p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(int)", p0));
+ }
+
+ function logUint(uint p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
+ }
+
+ function logString(string memory p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function logBool(bool p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
+ }
+
+ function logAddress(address p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
+ }
+
+ function logBytes(bytes memory p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
+ }
+
+ function logBytes1(bytes1 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
+ }
+
+ function logBytes2(bytes2 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
+ }
+
+ function logBytes3(bytes3 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
+ }
+
+ function logBytes4(bytes4 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
+ }
+
+ function logBytes5(bytes5 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
+ }
+
+ function logBytes6(bytes6 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
+ }
+
+ function logBytes7(bytes7 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
+ }
+
+ function logBytes8(bytes8 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
+ }
+
+ function logBytes9(bytes9 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
+ }
+
+ function logBytes10(bytes10 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
+ }
+
+ function logBytes11(bytes11 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
+ }
+
+ function logBytes12(bytes12 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
+ }
+
+ function logBytes13(bytes13 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
+ }
+
+ function logBytes14(bytes14 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
+ }
+
+ function logBytes15(bytes15 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
+ }
+
+ function logBytes16(bytes16 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
+ }
+
+ function logBytes17(bytes17 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
+ }
+
+ function logBytes18(bytes18 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
+ }
+
+ function logBytes19(bytes19 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
+ }
+
+ function logBytes20(bytes20 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
+ }
+
+ function logBytes21(bytes21 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
+ }
+
+ function logBytes22(bytes22 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
+ }
+
+ function logBytes23(bytes23 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
+ }
+
+ function logBytes24(bytes24 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
+ }
+
+ function logBytes25(bytes25 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
+ }
+
+ function logBytes26(bytes26 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
+ }
+
+ function logBytes27(bytes27 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
+ }
+
+ function logBytes28(bytes28 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
+ }
+
+ function logBytes29(bytes29 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
+ }
+
+ function logBytes30(bytes30 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
+ }
+
+ function logBytes31(bytes31 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
+ }
+
+ function logBytes32(bytes32 p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
+ }
+
+ function log(uint p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
+ }
+
+ function log(string memory p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function log(bool p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
+ }
+
+ function log(address p0) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
+ }
+
+ function log(uint p0, uint p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
+ }
+
+ function log(uint p0, string memory p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
+ }
+
+ function log(uint p0, bool p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
+ }
+
+ function log(uint p0, address p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
+ }
+
+ function log(string memory p0, uint p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
+ }
+
+ function log(string memory p0, string memory p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
+ }
+
+ function log(string memory p0, bool p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
+ }
+
+ function log(string memory p0, address p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
+ }
+
+ function log(bool p0, uint p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
+ }
+
+ function log(bool p0, string memory p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
+ }
+
+ function log(bool p0, bool p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
+ }
+
+ function log(bool p0, address p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
+ }
+
+ function log(address p0, uint p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
+ }
+
+ function log(address p0, string memory p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
+ }
+
+ function log(address p0, bool p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
+ }
+
+ function log(address p0, address p1) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
+ }
+
+ function log(uint p0, uint p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
+ }
+
+ function log(uint p0, uint p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
+ }
+
+ function log(uint p0, uint p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
+ }
+
+ function log(uint p0, uint p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
+ }
+
+ function log(uint p0, string memory p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
+ }
+
+ function log(uint p0, string memory p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
+ }
+
+ function log(uint p0, string memory p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
+ }
+
+ function log(uint p0, string memory p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
+ }
+
+ function log(uint p0, bool p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
+ }
+
+ function log(uint p0, bool p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
+ }
+
+ function log(uint p0, bool p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
+ }
+
+ function log(uint p0, bool p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
+ }
+
+ function log(uint p0, address p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
+ }
+
+ function log(uint p0, address p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
+ }
+
+ function log(uint p0, address p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
+ }
+
+ function log(uint p0, address p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
+ }
+
+ function log(address p0, uint p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
+ }
+
+ function log(address p0, uint p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
+ }
+
+ function log(address p0, uint p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, uint p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, uint p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, string memory p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, bool p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, address p2) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
+ }
+
+ function log(uint p0, uint p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, uint p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, string memory p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, bool p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint p0, address p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, uint p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, string memory p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, bool p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, address p3) internal view {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
+ }
+
+}
\ No newline at end of file
diff --git a/election-guard/lib/forge-std/src/console2.sol b/election-guard/lib/forge-std/src/console2.sol
new file mode 100644
index 00000000..c1e2cd75
--- /dev/null
+++ b/election-guard/lib/forge-std/src/console2.sol
@@ -0,0 +1,1558 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.4.22 <0.9.0;
+
+/// @dev The original console.sol uses `int` and `uint` for computing function selectors, but it should
+/// use `int256` and `uint256`. This modified version fixes that. This version is recommended
+/// over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in
+/// forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`.
+/// Reference: https://github.com/NomicFoundation/hardhat/issues/2178
+library console2 {
+ address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
+
+ function _castLogPayloadViewToPure(
+ function(bytes memory) internal view fnIn
+ ) internal pure returns (function(bytes memory) internal pure fnOut) {
+ assembly {
+ fnOut := fnIn
+ }
+ }
+
+ function _sendLogPayload(bytes memory payload) internal pure {
+ _castLogPayloadViewToPure(_sendLogPayloadView)(payload);
+ }
+
+ function _sendLogPayloadView(bytes memory payload) private view {
+ uint256 payloadLength = payload.length;
+ address consoleAddress = CONSOLE_ADDRESS;
+ /// @solidity memory-safe-assembly
+ assembly {
+ let payloadStart := add(payload, 32)
+ let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
+ }
+ }
+
+ function log() internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log()"));
+ }
+
+ function logInt(int256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
+ }
+
+ function logUint(uint256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
+ }
+
+ function logString(string memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function logBool(bool p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
+ }
+
+ function logAddress(address p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
+ }
+
+ function logBytes(bytes memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
+ }
+
+ function logBytes1(bytes1 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
+ }
+
+ function logBytes2(bytes2 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
+ }
+
+ function logBytes3(bytes3 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
+ }
+
+ function logBytes4(bytes4 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
+ }
+
+ function logBytes5(bytes5 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
+ }
+
+ function logBytes6(bytes6 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
+ }
+
+ function logBytes7(bytes7 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
+ }
+
+ function logBytes8(bytes8 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
+ }
+
+ function logBytes9(bytes9 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
+ }
+
+ function logBytes10(bytes10 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
+ }
+
+ function logBytes11(bytes11 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
+ }
+
+ function logBytes12(bytes12 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
+ }
+
+ function logBytes13(bytes13 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
+ }
+
+ function logBytes14(bytes14 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
+ }
+
+ function logBytes15(bytes15 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
+ }
+
+ function logBytes16(bytes16 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
+ }
+
+ function logBytes17(bytes17 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
+ }
+
+ function logBytes18(bytes18 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
+ }
+
+ function logBytes19(bytes19 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
+ }
+
+ function logBytes20(bytes20 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
+ }
+
+ function logBytes21(bytes21 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
+ }
+
+ function logBytes22(bytes22 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
+ }
+
+ function logBytes23(bytes23 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
+ }
+
+ function logBytes24(bytes24 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
+ }
+
+ function logBytes25(bytes25 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
+ }
+
+ function logBytes26(bytes26 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
+ }
+
+ function logBytes27(bytes27 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
+ }
+
+ function logBytes28(bytes28 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
+ }
+
+ function logBytes29(bytes29 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
+ }
+
+ function logBytes30(bytes30 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
+ }
+
+ function logBytes31(bytes31 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
+ }
+
+ function logBytes32(bytes32 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
+ }
+
+ function log(uint256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
+ }
+
+ function log(int256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
+ }
+
+ function log(string memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function log(bool p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
+ }
+
+ function log(address p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
+ }
+
+ function log(uint256 p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
+ }
+
+ function log(uint256 p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
+ }
+
+ function log(uint256 p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
+ }
+
+ function log(uint256 p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
+ }
+
+ function log(string memory p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
+ }
+
+ function log(string memory p0, int256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1));
+ }
+
+ function log(string memory p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
+ }
+
+ function log(string memory p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
+ }
+
+ function log(string memory p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
+ }
+
+ function log(bool p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
+ }
+
+ function log(bool p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
+ }
+
+ function log(bool p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
+ }
+
+ function log(bool p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
+ }
+
+ function log(address p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
+ }
+
+ function log(address p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
+ }
+
+ function log(address p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
+ }
+
+ function log(address p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
+ }
+
+}
\ No newline at end of file
diff --git a/election-guard/lib/forge-std/src/interfaces/IERC1155.sol b/election-guard/lib/forge-std/src/interfaces/IERC1155.sol
new file mode 100644
index 00000000..f7dd2b41
--- /dev/null
+++ b/election-guard/lib/forge-std/src/interfaces/IERC1155.sol
@@ -0,0 +1,105 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import "./IERC165.sol";
+
+/// @title ERC-1155 Multi Token Standard
+/// @dev See https://eips.ethereum.org/EIPS/eip-1155
+/// Note: The ERC-165 identifier for this interface is 0xd9b67a26.
+interface IERC1155 is IERC165 {
+ /// @dev
+ /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
+ /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender).
+ /// - The `_from` argument MUST be the address of the holder whose balance is decreased.
+ /// - The `_to` argument MUST be the address of the recipient whose balance is increased.
+ /// - The `_id` argument MUST be the token type being transferred.
+ /// - The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by.
+ /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
+ /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
+ event TransferSingle(
+ address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value
+ );
+
+ /// @dev
+ /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
+ /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender).
+ /// - The `_from` argument MUST be the address of the holder whose balance is decreased.
+ /// - The `_to` argument MUST be the address of the recipient whose balance is increased.
+ /// - The `_ids` argument MUST be the list of tokens being transferred.
+ /// - The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by.
+ /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
+ /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
+ event TransferBatch(
+ address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values
+ );
+
+ /// @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absence of an event assumes disabled).
+ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
+
+ /// @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986.
+ /// The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
+ event URI(string _value, uint256 indexed _id);
+
+ /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
+ /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
+ /// - MUST revert if `_to` is the zero address.
+ /// - MUST revert if balance of holder for token `_id` is lower than the `_value` sent.
+ /// - MUST revert on any other error.
+ /// - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
+ /// - After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
+ /// @param _from Source address
+ /// @param _to Target address
+ /// @param _id ID of the token type
+ /// @param _value Transfer amount
+ /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
+ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external;
+
+ /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
+ /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
+ /// - MUST revert if `_to` is the zero address.
+ /// - MUST revert if length of `_ids` is not the same as length of `_values`.
+ /// - MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
+ /// - MUST revert on any other error.
+ /// - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
+ /// - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
+ /// - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
+ /// @param _from Source address
+ /// @param _to Target address
+ /// @param _ids IDs of each token type (order and length must match _values array)
+ /// @param _values Transfer amounts per token type (order and length must match _ids array)
+ /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
+ function safeBatchTransferFrom(
+ address _from,
+ address _to,
+ uint256[] calldata _ids,
+ uint256[] calldata _values,
+ bytes calldata _data
+ ) external;
+
+ /// @notice Get the balance of an account's tokens.
+ /// @param _owner The address of the token holder
+ /// @param _id ID of the token
+ /// @return The _owner's balance of the token type requested
+ function balanceOf(address _owner, uint256 _id) external view returns (uint256);
+
+ /// @notice Get the balance of multiple account/token pairs
+ /// @param _owners The addresses of the token holders
+ /// @param _ids ID of the tokens
+ /// @return The _owner's balance of the token types requested (i.e. balance for each (owner, id) pair)
+ function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
+ external
+ view
+ returns (uint256[] memory);
+
+ /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
+ /// @dev MUST emit the ApprovalForAll event on success.
+ /// @param _operator Address to add to the set of authorized operators
+ /// @param _approved True if the operator is approved, false to revoke approval
+ function setApprovalForAll(address _operator, bool _approved) external;
+
+ /// @notice Queries the approval status of an operator for a given owner.
+ /// @param _owner The owner of the tokens
+ /// @param _operator Address of authorized operator
+ /// @return True if the operator is approved, false if not
+ function isApprovedForAll(address _owner, address _operator) external view returns (bool);
+}
diff --git a/election-guard/lib/forge-std/src/interfaces/IERC165.sol b/election-guard/lib/forge-std/src/interfaces/IERC165.sol
new file mode 100644
index 00000000..9af4bf80
--- /dev/null
+++ b/election-guard/lib/forge-std/src/interfaces/IERC165.sol
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+interface IERC165 {
+ /// @notice Query if a contract implements an interface
+ /// @param interfaceID The interface identifier, as specified in ERC-165
+ /// @dev Interface identification is specified in ERC-165. This function
+ /// uses less than 30,000 gas.
+ /// @return `true` if the contract implements `interfaceID` and
+ /// `interfaceID` is not 0xffffffff, `false` otherwise
+ function supportsInterface(bytes4 interfaceID) external view returns (bool);
+}
diff --git a/election-guard/lib/forge-std/src/interfaces/IERC20.sol b/election-guard/lib/forge-std/src/interfaces/IERC20.sol
new file mode 100644
index 00000000..ba40806c
--- /dev/null
+++ b/election-guard/lib/forge-std/src/interfaces/IERC20.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+/// @dev Interface of the ERC20 standard as defined in the EIP.
+/// @dev This includes the optional name, symbol, and decimals metadata.
+interface IERC20 {
+ /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).
+ event Transfer(address indexed from, address indexed to, uint256 value);
+
+ /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`
+ /// is the new allowance.
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+
+ /// @notice Returns the amount of tokens in existence.
+ function totalSupply() external view returns (uint256);
+
+ /// @notice Returns the amount of tokens owned by `account`.
+ function balanceOf(address account) external view returns (uint256);
+
+ /// @notice Moves `amount` tokens from the caller's account to `to`.
+ function transfer(address to, uint256 amount) external returns (bool);
+
+ /// @notice Returns the remaining number of tokens that `spender` is allowed
+ /// to spend on behalf of `owner`
+ function allowance(address owner, address spender) external view returns (uint256);
+
+ /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens.
+ /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
+ function approve(address spender, uint256 amount) external returns (bool);
+
+ /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism.
+ /// `amount` is then deducted from the caller's allowance.
+ function transferFrom(address from, address to, uint256 amount) external returns (bool);
+
+ /// @notice Returns the name of the token.
+ function name() external view returns (string memory);
+
+ /// @notice Returns the symbol of the token.
+ function symbol() external view returns (string memory);
+
+ /// @notice Returns the decimals places of the token.
+ function decimals() external view returns (uint8);
+}
diff --git a/election-guard/lib/forge-std/src/interfaces/IERC4626.sol b/election-guard/lib/forge-std/src/interfaces/IERC4626.sol
new file mode 100644
index 00000000..bfe3a115
--- /dev/null
+++ b/election-guard/lib/forge-std/src/interfaces/IERC4626.sol
@@ -0,0 +1,190 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import "./IERC20.sol";
+
+/// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in
+/// https://eips.ethereum.org/EIPS/eip-4626
+interface IERC4626 is IERC20 {
+ event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);
+
+ event Withdraw(
+ address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares
+ );
+
+ /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.
+ /// @dev
+ /// - MUST be an ERC-20 token contract.
+ /// - MUST NOT revert.
+ function asset() external view returns (address assetTokenAddress);
+
+ /// @notice Returns the total amount of the underlying asset that is “managed” by Vault.
+ /// @dev
+ /// - SHOULD include any compounding that occurs from yield.
+ /// - MUST be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT revert.
+ function totalAssets() external view returns (uint256 totalManagedAssets);
+
+ /// @notice Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal
+ /// scenario where all the conditions are met.
+ /// @dev
+ /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT show any variations depending on the caller.
+ /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ /// from.
+ function convertToShares(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal
+ /// scenario where all the conditions are met.
+ /// @dev
+ /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT show any variations depending on the caller.
+ /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ /// from.
+ function convertToAssets(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,
+ /// through a deposit call.
+ /// @dev
+ /// - MUST return a limited value if receiver is subject to some deposit limit.
+ /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.
+ /// - MUST NOT revert.
+ function maxDeposit(address receiver) external view returns (uint256 maxAssets);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given
+ /// current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit
+ /// call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called
+ /// in the same transaction.
+ /// - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the
+ /// deposit would be accepted, regardless if the user has enough tokens approved, etc.
+ /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ function previewDeposit(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.
+ /// @dev
+ /// - MUST emit the Deposit event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// deposit execution, and are accounted for during deposit.
+ /// - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not
+ /// approving enough underlying tokens to the Vault contract, etc).
+ ///
+ /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ function deposit(uint256 assets, address receiver) external returns (uint256 shares);
+
+ /// @notice Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.
+ /// @dev
+ /// - MUST return a limited value if receiver is subject to some mint limit.
+ /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.
+ /// - MUST NOT revert.
+ function maxMint(address receiver) external view returns (uint256 maxShares);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given
+ /// current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call
+ /// in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the
+ /// same transaction.
+ /// - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint
+ /// would be accepted, regardless if the user has enough tokens approved, etc.
+ /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by minting.
+ function previewMint(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.
+ /// @dev
+ /// - MUST emit the Deposit event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint
+ /// execution, and are accounted for during mint.
+ /// - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not
+ /// approving enough underlying tokens to the Vault contract, etc).
+ ///
+ /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ function mint(uint256 shares, address receiver) external returns (uint256 assets);
+
+ /// @notice Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the
+ /// Vault, through a withdraw call.
+ /// @dev
+ /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ /// - MUST NOT revert.
+ function maxWithdraw(address owner) external view returns (uint256 maxAssets);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,
+ /// given current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw
+ /// call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if
+ /// called
+ /// in the same transaction.
+ /// - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though
+ /// the withdrawal would be accepted, regardless if the user has enough shares, etc.
+ /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ function previewWithdraw(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Burns shares from owner and sends exactly assets of underlying tokens to receiver.
+ /// @dev
+ /// - MUST emit the Withdraw event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// withdraw execution, and are accounted for during withdraw.
+ /// - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner
+ /// not having enough shares, etc).
+ ///
+ /// Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ /// Those methods should be performed separately.
+ function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);
+
+ /// @notice Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,
+ /// through a redeem call.
+ /// @dev
+ /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ /// - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.
+ /// - MUST NOT revert.
+ function maxRedeem(address owner) external view returns (uint256 maxShares);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block,
+ /// given current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call
+ /// in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the
+ /// same transaction.
+ /// - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the
+ /// redemption would be accepted, regardless if the user has enough shares, etc.
+ /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by redeeming.
+ function previewRedeem(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Burns exactly shares from owner and sends assets of underlying tokens to receiver.
+ /// @dev
+ /// - MUST emit the Withdraw event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// redeem execution, and are accounted for during redeem.
+ /// - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner
+ /// not having enough shares, etc).
+ ///
+ /// NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ /// Those methods should be performed separately.
+ function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);
+}
diff --git a/election-guard/lib/forge-std/src/interfaces/IERC721.sol b/election-guard/lib/forge-std/src/interfaces/IERC721.sol
new file mode 100644
index 00000000..0a16f45c
--- /dev/null
+++ b/election-guard/lib/forge-std/src/interfaces/IERC721.sol
@@ -0,0 +1,164 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import "./IERC165.sol";
+
+/// @title ERC-721 Non-Fungible Token Standard
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.
+interface IERC721 is IERC165 {
+ /// @dev This emits when ownership of any NFT changes by any mechanism.
+ /// This event emits when NFTs are created (`from` == 0) and destroyed
+ /// (`to` == 0). Exception: during contract creation, any number of NFTs
+ /// may be created and assigned without emitting Transfer. At the time of
+ /// any transfer, the approved address for that NFT (if any) is reset to none.
+ event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
+
+ /// @dev This emits when the approved address for an NFT is changed or
+ /// reaffirmed. The zero address indicates there is no approved address.
+ /// When a Transfer event emits, this also indicates that the approved
+ /// address for that NFT (if any) is reset to none.
+ event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
+
+ /// @dev This emits when an operator is enabled or disabled for an owner.
+ /// The operator can manage all NFTs of the owner.
+ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
+
+ /// @notice Count all NFTs assigned to an owner
+ /// @dev NFTs assigned to the zero address are considered invalid, and this
+ /// function throws for queries about the zero address.
+ /// @param _owner An address for whom to query the balance
+ /// @return The number of NFTs owned by `_owner`, possibly zero
+ function balanceOf(address _owner) external view returns (uint256);
+
+ /// @notice Find the owner of an NFT
+ /// @dev NFTs assigned to zero address are considered invalid, and queries
+ /// about them do throw.
+ /// @param _tokenId The identifier for an NFT
+ /// @return The address of the owner of the NFT
+ function ownerOf(uint256 _tokenId) external view returns (address);
+
+ /// @notice Transfers the ownership of an NFT from one address to another address
+ /// @dev Throws unless `msg.sender` is the current owner, an authorized
+ /// operator, or the approved address for this NFT. Throws if `_from` is
+ /// not the current owner. Throws if `_to` is the zero address. Throws if
+ /// `_tokenId` is not a valid NFT. When transfer is complete, this function
+ /// checks if `_to` is a smart contract (code size > 0). If so, it calls
+ /// `onERC721Received` on `_to` and throws if the return value is not
+ /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ /// @param data Additional data with no specified format, sent in call to `_to`
+ function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;
+
+ /// @notice Transfers the ownership of an NFT from one address to another address
+ /// @dev This works identically to the other function with an extra data parameter,
+ /// except this function just sets data to "".
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
+
+ /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
+ /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
+ /// THEY MAY BE PERMANENTLY LOST
+ /// @dev Throws unless `msg.sender` is the current owner, an authorized
+ /// operator, or the approved address for this NFT. Throws if `_from` is
+ /// not the current owner. Throws if `_to` is the zero address. Throws if
+ /// `_tokenId` is not a valid NFT.
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
+
+ /// @notice Change or reaffirm the approved address for an NFT
+ /// @dev The zero address indicates there is no approved address.
+ /// Throws unless `msg.sender` is the current NFT owner, or an authorized
+ /// operator of the current owner.
+ /// @param _approved The new approved NFT controller
+ /// @param _tokenId The NFT to approve
+ function approve(address _approved, uint256 _tokenId) external payable;
+
+ /// @notice Enable or disable approval for a third party ("operator") to manage
+ /// all of `msg.sender`'s assets
+ /// @dev Emits the ApprovalForAll event. The contract MUST allow
+ /// multiple operators per owner.
+ /// @param _operator Address to add to the set of authorized operators
+ /// @param _approved True if the operator is approved, false to revoke approval
+ function setApprovalForAll(address _operator, bool _approved) external;
+
+ /// @notice Get the approved address for a single NFT
+ /// @dev Throws if `_tokenId` is not a valid NFT.
+ /// @param _tokenId The NFT to find the approved address for
+ /// @return The approved address for this NFT, or the zero address if there is none
+ function getApproved(uint256 _tokenId) external view returns (address);
+
+ /// @notice Query if an address is an authorized operator for another address
+ /// @param _owner The address that owns the NFTs
+ /// @param _operator The address that acts on behalf of the owner
+ /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
+ function isApprovedForAll(address _owner, address _operator) external view returns (bool);
+}
+
+/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
+interface IERC721TokenReceiver {
+ /// @notice Handle the receipt of an NFT
+ /// @dev The ERC721 smart contract calls this function on the recipient
+ /// after a `transfer`. This function MAY throw to revert and reject the
+ /// transfer. Return of other than the magic value MUST result in the
+ /// transaction being reverted.
+ /// Note: the contract address is always the message sender.
+ /// @param _operator The address which called `safeTransferFrom` function
+ /// @param _from The address which previously owned the token
+ /// @param _tokenId The NFT identifier which is being transferred
+ /// @param _data Additional data with no specified format
+ /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
+ /// unless throwing
+ function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data)
+ external
+ returns (bytes4);
+}
+
+/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.
+interface IERC721Metadata is IERC721 {
+ /// @notice A descriptive name for a collection of NFTs in this contract
+ function name() external view returns (string memory _name);
+
+ /// @notice An abbreviated name for NFTs in this contract
+ function symbol() external view returns (string memory _symbol);
+
+ /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
+ /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
+ /// 3986. The URI may point to a JSON file that conforms to the "ERC721
+ /// Metadata JSON Schema".
+ function tokenURI(uint256 _tokenId) external view returns (string memory);
+}
+
+/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x780e9d63.
+interface IERC721Enumerable is IERC721 {
+ /// @notice Count NFTs tracked by this contract
+ /// @return A count of valid NFTs tracked by this contract, where each one of
+ /// them has an assigned and queryable owner not equal to the zero address
+ function totalSupply() external view returns (uint256);
+
+ /// @notice Enumerate valid NFTs
+ /// @dev Throws if `_index` >= `totalSupply()`.
+ /// @param _index A counter less than `totalSupply()`
+ /// @return The token identifier for the `_index`th NFT,
+ /// (sort order not specified)
+ function tokenByIndex(uint256 _index) external view returns (uint256);
+
+ /// @notice Enumerate NFTs assigned to an owner
+ /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
+ /// `_owner` is the zero address, representing invalid NFTs.
+ /// @param _owner An address where we are interested in NFTs owned by them
+ /// @param _index A counter less than `balanceOf(_owner)`
+ /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
+ /// (sort order not specified)
+ function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
+}
diff --git a/election-guard/lib/forge-std/src/interfaces/IMulticall3.sol b/election-guard/lib/forge-std/src/interfaces/IMulticall3.sol
new file mode 100644
index 00000000..0d031b71
--- /dev/null
+++ b/election-guard/lib/forge-std/src/interfaces/IMulticall3.sol
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+interface IMulticall3 {
+ struct Call {
+ address target;
+ bytes callData;
+ }
+
+ struct Call3 {
+ address target;
+ bool allowFailure;
+ bytes callData;
+ }
+
+ struct Call3Value {
+ address target;
+ bool allowFailure;
+ uint256 value;
+ bytes callData;
+ }
+
+ struct Result {
+ bool success;
+ bytes returnData;
+ }
+
+ function aggregate(Call[] calldata calls)
+ external
+ payable
+ returns (uint256 blockNumber, bytes[] memory returnData);
+
+ function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);
+
+ function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);
+
+ function blockAndAggregate(Call[] calldata calls)
+ external
+ payable
+ returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);
+
+ function getBasefee() external view returns (uint256 basefee);
+
+ function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash);
+
+ function getBlockNumber() external view returns (uint256 blockNumber);
+
+ function getChainId() external view returns (uint256 chainid);
+
+ function getCurrentBlockCoinbase() external view returns (address coinbase);
+
+ function getCurrentBlockDifficulty() external view returns (uint256 difficulty);
+
+ function getCurrentBlockGasLimit() external view returns (uint256 gaslimit);
+
+ function getCurrentBlockTimestamp() external view returns (uint256 timestamp);
+
+ function getEthBalance(address addr) external view returns (uint256 balance);
+
+ function getLastBlockHash() external view returns (bytes32 blockHash);
+
+ function tryAggregate(bool requireSuccess, Call[] calldata calls)
+ external
+ payable
+ returns (Result[] memory returnData);
+
+ function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls)
+ external
+ payable
+ returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);
+}
diff --git a/election-guard/lib/forge-std/src/safeconsole.sol b/election-guard/lib/forge-std/src/safeconsole.sol
new file mode 100644
index 00000000..5714d090
--- /dev/null
+++ b/election-guard/lib/forge-std/src/safeconsole.sol
@@ -0,0 +1,13248 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+/// @author philogy
+/// @dev Code generated automatically by script.
+library safeconsole {
+ uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67;
+
+ // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374)
+ // for the view-to-pure log trick.
+ function _sendLogPayload(uint256 offset, uint256 size) private pure {
+ function(uint256, uint256) internal view fnIn = _sendLogPayloadView;
+ function(uint256, uint256) internal pure pureSendLogPayload;
+ assembly {
+ pureSendLogPayload := fnIn
+ }
+ pureSendLogPayload(offset, size);
+ }
+
+ function _sendLogPayloadView(uint256 offset, uint256 size) private view {
+ assembly {
+ pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0))
+ }
+ }
+
+ function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure {
+ function(uint256, uint256, uint256) internal view fnIn = _memcopyView;
+ function(uint256, uint256, uint256) internal pure pureMemcopy;
+ assembly {
+ pureMemcopy := fnIn
+ }
+ pureMemcopy(fromOffset, toOffset, length);
+ }
+
+ function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view {
+ assembly {
+ pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length))
+ }
+ }
+
+ function logMemory(uint256 offset, uint256 length) internal pure {
+ if (offset >= 0x60) {
+ // Sufficient memory before slice to prepare call header.
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly {
+ m0 := mload(sub(offset, 0x60))
+ m1 := mload(sub(offset, 0x40))
+ m2 := mload(sub(offset, 0x20))
+ // Selector of `logBytes(bytes)`.
+ mstore(sub(offset, 0x60), 0xe17bf956)
+ mstore(sub(offset, 0x40), 0x20)
+ mstore(sub(offset, 0x20), length)
+ }
+ _sendLogPayload(offset - 0x44, length + 0x44);
+ assembly {
+ mstore(sub(offset, 0x60), m0)
+ mstore(sub(offset, 0x40), m1)
+ mstore(sub(offset, 0x20), m2)
+ }
+ } else {
+ // Insufficient space, so copy slice forward, add header and reverse.
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ uint256 endOffset = offset + length;
+ assembly {
+ m0 := mload(add(endOffset, 0x00))
+ m1 := mload(add(endOffset, 0x20))
+ m2 := mload(add(endOffset, 0x40))
+ }
+ _memcopy(offset, offset + 0x60, length);
+ assembly {
+ // Selector of `logBytes(bytes)`.
+ mstore(add(offset, 0x00), 0xe17bf956)
+ mstore(add(offset, 0x20), 0x20)
+ mstore(add(offset, 0x40), length)
+ }
+ _sendLogPayload(offset + 0x1c, length + 0x44);
+ _memcopy(offset + 0x60, offset, length);
+ assembly {
+ mstore(add(endOffset, 0x00), m0)
+ mstore(add(endOffset, 0x20), m1)
+ mstore(add(endOffset, 0x40), m2)
+ }
+ }
+ }
+
+ function log(address p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(address)`.
+ mstore(0x00, 0x2c2ecbc2)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(bool p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(bool)`.
+ mstore(0x00, 0x32458eed)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(uint256 p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(uint256)`.
+ mstore(0x00, 0xf82c50f1)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(bytes32 p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(string)`.
+ mstore(0x00, 0x41304fac)
+ mstore(0x20, 0x20)
+ writeString(0x40, p0)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,address)`.
+ mstore(0x00, 0xdaf0d4aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,bool)`.
+ mstore(0x00, 0x75b605d3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,uint256)`.
+ mstore(0x00, 0x8309e8a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,string)`.
+ mstore(0x00, 0x759f86bb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,address)`.
+ mstore(0x00, 0x853c4849)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,bool)`.
+ mstore(0x00, 0x2a110e83)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,uint256)`.
+ mstore(0x00, 0x399174d3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,string)`.
+ mstore(0x00, 0x8feac525)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,address)`.
+ mstore(0x00, 0x69276c86)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,bool)`.
+ mstore(0x00, 0x1c9d7eb3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,uint256)`.
+ mstore(0x00, 0xf666715a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,string)`.
+ mstore(0x00, 0x643fd0df)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,address)`.
+ mstore(0x00, 0x319af333)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,bool)`.
+ mstore(0x00, 0xc3b55635)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,uint256)`.
+ mstore(0x00, 0xb60e72cc)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,string)`.
+ mstore(0x00, 0x4b5c4277)
+ mstore(0x20, 0x40)
+ mstore(0x40, 0x80)
+ writeString(0x60, p0)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,address)`.
+ mstore(0x00, 0x018c84c2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,bool)`.
+ mstore(0x00, 0xf2a66286)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,uint256)`.
+ mstore(0x00, 0x17fe6185)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,address,string)`.
+ mstore(0x00, 0x007150be)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,address)`.
+ mstore(0x00, 0xf11699ed)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,bool)`.
+ mstore(0x00, 0xeb830c92)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,uint256)`.
+ mstore(0x00, 0x9c4f99fb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,bool,string)`.
+ mstore(0x00, 0x212255cc)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,address)`.
+ mstore(0x00, 0x7bc0d848)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,bool)`.
+ mstore(0x00, 0x678209a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,uint256)`.
+ mstore(0x00, 0xb69bcaf6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,uint256,string)`.
+ mstore(0x00, 0xa1f2e8aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,address)`.
+ mstore(0x00, 0xf08744e8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,bool)`.
+ mstore(0x00, 0xcf020fb1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,uint256)`.
+ mstore(0x00, 0x67dd6ff1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(address,string,string)`.
+ mstore(0x00, 0xfb772265)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bool p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,address)`.
+ mstore(0x00, 0xd2763667)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,bool)`.
+ mstore(0x00, 0x18c9c746)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,uint256)`.
+ mstore(0x00, 0x5f7b9afb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,address,string)`.
+ mstore(0x00, 0xde9a9270)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,address)`.
+ mstore(0x00, 0x1078f68d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,bool)`.
+ mstore(0x00, 0x50709698)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,uint256)`.
+ mstore(0x00, 0x12f21602)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,bool,string)`.
+ mstore(0x00, 0x2555fa46)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,address)`.
+ mstore(0x00, 0x088ef9d2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,bool)`.
+ mstore(0x00, 0xe8defba9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,uint256)`.
+ mstore(0x00, 0x37103367)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,uint256,string)`.
+ mstore(0x00, 0xc3fc3970)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,address)`.
+ mstore(0x00, 0x9591b953)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,bool)`.
+ mstore(0x00, 0xdbb4c247)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,uint256)`.
+ mstore(0x00, 0x1093ee11)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(bool,string,string)`.
+ mstore(0x00, 0xb076847f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,address)`.
+ mstore(0x00, 0xbcfd9be0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,bool)`.
+ mstore(0x00, 0x9b6ec042)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,uint256)`.
+ mstore(0x00, 0x5a9b5ed5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,address,string)`.
+ mstore(0x00, 0x63cb41f9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,address)`.
+ mstore(0x00, 0x35085f7b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,bool)`.
+ mstore(0x00, 0x20718650)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,uint256)`.
+ mstore(0x00, 0x20098014)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,bool,string)`.
+ mstore(0x00, 0x85775021)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,address)`.
+ mstore(0x00, 0x5c96b331)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,bool)`.
+ mstore(0x00, 0x4766da72)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,uint256)`.
+ mstore(0x00, 0xd1ed7a3c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,uint256,string)`.
+ mstore(0x00, 0x71d04af2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,address)`.
+ mstore(0x00, 0x7afac959)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,bool)`.
+ mstore(0x00, 0x4ceda75a)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,uint256)`.
+ mstore(0x00, 0x37aa7d4c)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(uint256,string,string)`.
+ mstore(0x00, 0xb115611f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,address)`.
+ mstore(0x00, 0xfcec75e0)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,bool)`.
+ mstore(0x00, 0xc91d5ed4)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,uint256)`.
+ mstore(0x00, 0x0d26b925)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,address,string)`.
+ mstore(0x00, 0xe0e9ad4f)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,address)`.
+ mstore(0x00, 0x932bbb38)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,bool)`.
+ mstore(0x00, 0x850b7ad6)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,uint256)`.
+ mstore(0x00, 0xc95958d6)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,bool,string)`.
+ mstore(0x00, 0xe298f47d)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,address)`.
+ mstore(0x00, 0x1c7ec448)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,bool)`.
+ mstore(0x00, 0xca7733b1)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,uint256)`.
+ mstore(0x00, 0xca47c4eb)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,uint256,string)`.
+ mstore(0x00, 0x5970e089)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,address)`.
+ mstore(0x00, 0x95ed0195)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,bool)`.
+ mstore(0x00, 0xb0e0f9b5)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,uint256)`.
+ mstore(0x00, 0x5821efa1)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ // Selector of `log(string,string,string)`.
+ mstore(0x00, 0x2ced7cef)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, 0xe0)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ writeString(0x100, p2)
+ }
+ _sendLogPayload(0x1c, 0x124);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ }
+ }
+
+ function log(address p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,address)`.
+ mstore(0x00, 0x665bf134)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,bool)`.
+ mstore(0x00, 0x0e378994)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,uint256)`.
+ mstore(0x00, 0x94250d77)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,address,string)`.
+ mstore(0x00, 0xf808da20)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,address)`.
+ mstore(0x00, 0x9f1bc36e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,bool)`.
+ mstore(0x00, 0x2cd4134a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,uint256)`.
+ mstore(0x00, 0x3971e78c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,bool,string)`.
+ mstore(0x00, 0xaa6540c8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,address)`.
+ mstore(0x00, 0x8da6def5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,bool)`.
+ mstore(0x00, 0x9b4254e2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,uint256)`.
+ mstore(0x00, 0xbe553481)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,uint256,string)`.
+ mstore(0x00, 0xfdb4f990)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,address)`.
+ mstore(0x00, 0x8f736d16)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,bool)`.
+ mstore(0x00, 0x6f1a594e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,uint256)`.
+ mstore(0x00, 0xef1cefe7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,address,string,string)`.
+ mstore(0x00, 0x21bdaf25)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,address)`.
+ mstore(0x00, 0x660375dd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,bool)`.
+ mstore(0x00, 0xa6f50b0f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,uint256)`.
+ mstore(0x00, 0xa75c59de)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,address,string)`.
+ mstore(0x00, 0x2dd778e6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,address)`.
+ mstore(0x00, 0xcf394485)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,bool)`.
+ mstore(0x00, 0xcac43479)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,uint256)`.
+ mstore(0x00, 0x8c4e5de6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,bool,string)`.
+ mstore(0x00, 0xdfc4a2e8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,address)`.
+ mstore(0x00, 0xccf790a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,bool)`.
+ mstore(0x00, 0xc4643e20)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,uint256)`.
+ mstore(0x00, 0x386ff5f4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,uint256,string)`.
+ mstore(0x00, 0x0aa6cfad)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,address)`.
+ mstore(0x00, 0x19fd4956)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,bool)`.
+ mstore(0x00, 0x50ad461d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,uint256)`.
+ mstore(0x00, 0x80e6a20b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,bool,string,string)`.
+ mstore(0x00, 0x475c5c33)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,address)`.
+ mstore(0x00, 0x478d1c62)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,bool)`.
+ mstore(0x00, 0xa1bcc9b3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,uint256)`.
+ mstore(0x00, 0x100f650e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,address,string)`.
+ mstore(0x00, 0x1da986ea)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,address)`.
+ mstore(0x00, 0xa31bfdcc)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,bool)`.
+ mstore(0x00, 0x3bf5e537)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,uint256)`.
+ mstore(0x00, 0x22f6b999)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,bool,string)`.
+ mstore(0x00, 0xc5ad85f9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,address)`.
+ mstore(0x00, 0x20e3984d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,bool)`.
+ mstore(0x00, 0x66f1bc67)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,uint256)`.
+ mstore(0x00, 0x34f0e636)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,uint256,string)`.
+ mstore(0x00, 0x4a28c017)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,address)`.
+ mstore(0x00, 0x5c430d47)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,bool)`.
+ mstore(0x00, 0xcf18105c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,uint256)`.
+ mstore(0x00, 0xbf01f891)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,uint256,string,string)`.
+ mstore(0x00, 0x88a8c406)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,address)`.
+ mstore(0x00, 0x0d36fa20)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,bool)`.
+ mstore(0x00, 0x0df12b76)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,uint256)`.
+ mstore(0x00, 0x457fe3cf)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,address,string)`.
+ mstore(0x00, 0xf7e36245)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,address)`.
+ mstore(0x00, 0x205871c2)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,bool)`.
+ mstore(0x00, 0x5f1d5c9f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,uint256)`.
+ mstore(0x00, 0x515e38b6)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,bool,string)`.
+ mstore(0x00, 0xbc0b61fe)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,address)`.
+ mstore(0x00, 0x63183678)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,bool)`.
+ mstore(0x00, 0x0ef7e050)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,uint256)`.
+ mstore(0x00, 0x1dc8e1b8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,uint256,string)`.
+ mstore(0x00, 0x448830a8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,address)`.
+ mstore(0x00, 0xa04e2f87)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,bool)`.
+ mstore(0x00, 0x35a5071f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,uint256)`.
+ mstore(0x00, 0x159f8927)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(address,string,string,string)`.
+ mstore(0x00, 0x5d02c50b)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,address)`.
+ mstore(0x00, 0x1d14d001)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,bool)`.
+ mstore(0x00, 0x46600be0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,uint256)`.
+ mstore(0x00, 0x0c66d1be)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,address,string)`.
+ mstore(0x00, 0xd812a167)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,address)`.
+ mstore(0x00, 0x1c41a336)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,bool)`.
+ mstore(0x00, 0x6a9c478b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,uint256)`.
+ mstore(0x00, 0x07831502)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,bool,string)`.
+ mstore(0x00, 0x4a66cb34)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,address)`.
+ mstore(0x00, 0x136b05dd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,bool)`.
+ mstore(0x00, 0xd6019f1c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,uint256)`.
+ mstore(0x00, 0x7bf181a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,uint256,string)`.
+ mstore(0x00, 0x51f09ff8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,address)`.
+ mstore(0x00, 0x6f7c603e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,bool)`.
+ mstore(0x00, 0xe2bfd60b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,uint256)`.
+ mstore(0x00, 0xc21f64c7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,address,string,string)`.
+ mstore(0x00, 0xa73c1db6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,address)`.
+ mstore(0x00, 0xf4880ea4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,bool)`.
+ mstore(0x00, 0xc0a302d8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,uint256)`.
+ mstore(0x00, 0x4c123d57)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,address,string)`.
+ mstore(0x00, 0xa0a47963)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,address)`.
+ mstore(0x00, 0x8c329b1a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,bool)`.
+ mstore(0x00, 0x3b2a5ce0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,uint256)`.
+ mstore(0x00, 0x6d7045c1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,bool,string)`.
+ mstore(0x00, 0x2ae408d4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,address)`.
+ mstore(0x00, 0x54a7a9a0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,bool)`.
+ mstore(0x00, 0x619e4d0e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,uint256)`.
+ mstore(0x00, 0x0bb00eab)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,uint256,string)`.
+ mstore(0x00, 0x7dd4d0e0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,address)`.
+ mstore(0x00, 0xf9ad2b89)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,bool)`.
+ mstore(0x00, 0xb857163a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,uint256)`.
+ mstore(0x00, 0xe3a9ca2f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,bool,string,string)`.
+ mstore(0x00, 0x6d1e8751)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,address)`.
+ mstore(0x00, 0x26f560a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,bool)`.
+ mstore(0x00, 0xb4c314ff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,uint256)`.
+ mstore(0x00, 0x1537dc87)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,address,string)`.
+ mstore(0x00, 0x1bb3b09a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,address)`.
+ mstore(0x00, 0x9acd3616)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,bool)`.
+ mstore(0x00, 0xceb5f4d7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,uint256)`.
+ mstore(0x00, 0x7f9bbca2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,bool,string)`.
+ mstore(0x00, 0x9143dbb1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,address)`.
+ mstore(0x00, 0x00dd87b9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,bool)`.
+ mstore(0x00, 0xbe984353)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,uint256)`.
+ mstore(0x00, 0x374bb4b2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,uint256,string)`.
+ mstore(0x00, 0x8e69fb5d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,address)`.
+ mstore(0x00, 0xfedd1fff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,bool)`.
+ mstore(0x00, 0xe5e70b2b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,uint256)`.
+ mstore(0x00, 0x6a1199e2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,uint256,string,string)`.
+ mstore(0x00, 0xf5bc2249)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,address)`.
+ mstore(0x00, 0x2b2b18dc)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,bool)`.
+ mstore(0x00, 0x6dd434ca)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,uint256)`.
+ mstore(0x00, 0xa5cada94)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,address,string)`.
+ mstore(0x00, 0x12d6c788)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,address)`.
+ mstore(0x00, 0x538e06ab)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,bool)`.
+ mstore(0x00, 0xdc5e935b)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,uint256)`.
+ mstore(0x00, 0x1606a393)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,bool,string)`.
+ mstore(0x00, 0x483d0416)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,address)`.
+ mstore(0x00, 0x1596a1ce)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,bool)`.
+ mstore(0x00, 0x6b0e5d53)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,uint256)`.
+ mstore(0x00, 0x28863fcb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,uint256,string)`.
+ mstore(0x00, 0x1ad96de6)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,address)`.
+ mstore(0x00, 0x97d394d8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,bool)`.
+ mstore(0x00, 0x1e4b87e5)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,uint256)`.
+ mstore(0x00, 0x7be0c3eb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(bool,string,string,string)`.
+ mstore(0x00, 0x1762e32a)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,address)`.
+ mstore(0x00, 0x2488b414)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,bool)`.
+ mstore(0x00, 0x091ffaf5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,uint256)`.
+ mstore(0x00, 0x736efbb6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,address,string)`.
+ mstore(0x00, 0x031c6f73)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,address)`.
+ mstore(0x00, 0xef72c513)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,bool)`.
+ mstore(0x00, 0xe351140f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,uint256)`.
+ mstore(0x00, 0x5abd992a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,bool,string)`.
+ mstore(0x00, 0x90fb06aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,address)`.
+ mstore(0x00, 0x15c127b5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,bool)`.
+ mstore(0x00, 0x5f743a7c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,uint256)`.
+ mstore(0x00, 0x0c9cd9c1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,uint256,string)`.
+ mstore(0x00, 0xddb06521)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,address)`.
+ mstore(0x00, 0x9cba8fff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,bool)`.
+ mstore(0x00, 0xcc32ab07)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,uint256)`.
+ mstore(0x00, 0x46826b5d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,address,string,string)`.
+ mstore(0x00, 0x3e128ca3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,address)`.
+ mstore(0x00, 0xa1ef4cbb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,bool)`.
+ mstore(0x00, 0x454d54a5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,uint256)`.
+ mstore(0x00, 0x078287f5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,address,string)`.
+ mstore(0x00, 0xade052c7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,address)`.
+ mstore(0x00, 0x69640b59)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,bool)`.
+ mstore(0x00, 0xb6f577a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,uint256)`.
+ mstore(0x00, 0x7464ce23)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,bool,string)`.
+ mstore(0x00, 0xdddb9561)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,address)`.
+ mstore(0x00, 0x88cb6041)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,bool)`.
+ mstore(0x00, 0x91a02e2a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,uint256)`.
+ mstore(0x00, 0xc6acc7a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,uint256,string)`.
+ mstore(0x00, 0xde03e774)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,address)`.
+ mstore(0x00, 0xef529018)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,bool)`.
+ mstore(0x00, 0xeb928d7f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,uint256)`.
+ mstore(0x00, 0x2c1d0746)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,bool,string,string)`.
+ mstore(0x00, 0x68c8b8bd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,address)`.
+ mstore(0x00, 0x56a5d1b1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,bool)`.
+ mstore(0x00, 0x15cac476)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,uint256)`.
+ mstore(0x00, 0x88f6e4b2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,address,string)`.
+ mstore(0x00, 0x6cde40b8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,address)`.
+ mstore(0x00, 0x9a816a83)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,bool)`.
+ mstore(0x00, 0xab085ae6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,uint256)`.
+ mstore(0x00, 0xeb7f6fd2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,bool,string)`.
+ mstore(0x00, 0xa5b4fc99)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,address)`.
+ mstore(0x00, 0xfa8185af)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,bool)`.
+ mstore(0x00, 0xc598d185)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,uint256)`.
+ mstore(0x00, 0x193fb800)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,uint256,string)`.
+ mstore(0x00, 0x59cfcbe3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,address)`.
+ mstore(0x00, 0x42d21db7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,bool)`.
+ mstore(0x00, 0x7af6ab25)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,uint256)`.
+ mstore(0x00, 0x5da297eb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,uint256,string,string)`.
+ mstore(0x00, 0x27d8afd2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,address)`.
+ mstore(0x00, 0x6168ed61)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,bool)`.
+ mstore(0x00, 0x90c30a56)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,uint256)`.
+ mstore(0x00, 0xe8d3018d)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,address,string)`.
+ mstore(0x00, 0x9c3adfa1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,address)`.
+ mstore(0x00, 0xae2ec581)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,bool)`.
+ mstore(0x00, 0xba535d9c)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,uint256)`.
+ mstore(0x00, 0xcf009880)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,bool,string)`.
+ mstore(0x00, 0xd2d423cd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,address)`.
+ mstore(0x00, 0x3b2279b4)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,bool)`.
+ mstore(0x00, 0x691a8f74)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,uint256)`.
+ mstore(0x00, 0x82c25b74)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,uint256,string)`.
+ mstore(0x00, 0xb7b914ca)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,address)`.
+ mstore(0x00, 0xd583c602)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,bool)`.
+ mstore(0x00, 0xb3a6b6bd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,uint256)`.
+ mstore(0x00, 0xb028c9bd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(uint256,string,string,string)`.
+ mstore(0x00, 0x21ad0683)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,address)`.
+ mstore(0x00, 0xed8f28f6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,bool)`.
+ mstore(0x00, 0xb59dbd60)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,uint256)`.
+ mstore(0x00, 0x8ef3f399)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,address,string)`.
+ mstore(0x00, 0x800a1c67)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,address)`.
+ mstore(0x00, 0x223603bd)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,bool)`.
+ mstore(0x00, 0x79884c2b)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,uint256)`.
+ mstore(0x00, 0x3e9f866a)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,bool,string)`.
+ mstore(0x00, 0x0454c079)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,address)`.
+ mstore(0x00, 0x63fb8bc5)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,bool)`.
+ mstore(0x00, 0xfc4845f0)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,uint256)`.
+ mstore(0x00, 0xf8f51b1e)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,uint256,string)`.
+ mstore(0x00, 0x5a477632)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,address)`.
+ mstore(0x00, 0xaabc9a31)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,bool)`.
+ mstore(0x00, 0x5f15d28c)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,uint256)`.
+ mstore(0x00, 0x91d1112e)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,address,string,string)`.
+ mstore(0x00, 0x245986f2)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,address)`.
+ mstore(0x00, 0x33e9dd1d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,bool)`.
+ mstore(0x00, 0x958c28c6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,uint256)`.
+ mstore(0x00, 0x5d08bb05)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,address,string)`.
+ mstore(0x00, 0x2d8e33a4)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,address)`.
+ mstore(0x00, 0x7190a529)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,bool)`.
+ mstore(0x00, 0x895af8c5)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,uint256)`.
+ mstore(0x00, 0x8e3f78a9)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,bool,string)`.
+ mstore(0x00, 0x9d22d5dd)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,address)`.
+ mstore(0x00, 0x935e09bf)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,bool)`.
+ mstore(0x00, 0x8af7cf8a)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,uint256)`.
+ mstore(0x00, 0x64b5bb67)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,uint256,string)`.
+ mstore(0x00, 0x742d6ee7)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,address)`.
+ mstore(0x00, 0xe0625b29)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,bool)`.
+ mstore(0x00, 0x3f8a701d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,uint256)`.
+ mstore(0x00, 0x24f91465)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,bool,string,string)`.
+ mstore(0x00, 0xa826caeb)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,address)`.
+ mstore(0x00, 0x5ea2b7ae)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,bool)`.
+ mstore(0x00, 0x82112a42)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,uint256)`.
+ mstore(0x00, 0x4f04fdc6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,address,string)`.
+ mstore(0x00, 0x9ffb2f93)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,address)`.
+ mstore(0x00, 0xe0e95b98)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,bool)`.
+ mstore(0x00, 0x354c36d6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,uint256)`.
+ mstore(0x00, 0xe41b6f6f)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,bool,string)`.
+ mstore(0x00, 0xabf73a98)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,address)`.
+ mstore(0x00, 0xe21de278)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,bool)`.
+ mstore(0x00, 0x7626db92)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,uint256)`.
+ mstore(0x00, 0xa7a87853)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,uint256,string)`.
+ mstore(0x00, 0x854b3496)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,address)`.
+ mstore(0x00, 0x7c4632a4)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,bool)`.
+ mstore(0x00, 0x7d24491d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,uint256)`.
+ mstore(0x00, 0xc67ea9d1)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,uint256,string,string)`.
+ mstore(0x00, 0x5ab84e1f)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,address)`.
+ mstore(0x00, 0x439c7bef)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,bool)`.
+ mstore(0x00, 0x5ccd4e37)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,uint256)`.
+ mstore(0x00, 0x7cc3c607)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,address,string)`.
+ mstore(0x00, 0xeb1bff80)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,address)`.
+ mstore(0x00, 0xc371c7db)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,bool)`.
+ mstore(0x00, 0x40785869)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,uint256)`.
+ mstore(0x00, 0xd6aefad2)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,bool,string)`.
+ mstore(0x00, 0x5e84b0ea)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,address)`.
+ mstore(0x00, 0x1023f7b2)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,bool)`.
+ mstore(0x00, 0xc3a8a654)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,uint256)`.
+ mstore(0x00, 0xf45d7d2c)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,uint256,string)`.
+ mstore(0x00, 0x5d1a971a)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,address)`.
+ mstore(0x00, 0x6d572f44)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,bool)`.
+ mstore(0x00, 0x2c1754ed)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,uint256)`.
+ mstore(0x00, 0x8eafb02b)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ bytes32 m11;
+ bytes32 m12;
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ m11 := mload(0x160)
+ m12 := mload(0x180)
+ // Selector of `log(string,string,string,string)`.
+ mstore(0x00, 0xde68f20a)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, 0x140)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ writeString(0x160, p3)
+ }
+ _sendLogPayload(0x1c, 0x184);
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ mstore(0x160, m11)
+ mstore(0x180, m12)
+ }
+ }
+}
diff --git a/election-guard/lib/forge-std/test/StdAssertions.t.sol b/election-guard/lib/forge-std/test/StdAssertions.t.sol
new file mode 100644
index 00000000..fcc346be
--- /dev/null
+++ b/election-guard/lib/forge-std/test/StdAssertions.t.sol
@@ -0,0 +1,999 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import "../src/Test.sol";
+
+contract StdAssertionsTest is Test {
+ string constant CUSTOM_ERROR = "guh!";
+
+ bool constant EXPECT_PASS = false;
+ bool constant EXPECT_FAIL = true;
+
+ bool constant SHOULD_REVERT = true;
+ bool constant SHOULD_RETURN = false;
+
+ bool constant STRICT_REVERT_DATA = true;
+ bool constant NON_STRICT_REVERT_DATA = false;
+
+ TestTest t = new TestTest();
+
+ /*//////////////////////////////////////////////////////////////////////////
+ FAIL(STRING)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testShouldFail() external {
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._fail(CUSTOM_ERROR);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ ASSERT_FALSE
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertFalse_Pass() external {
+ t._assertFalse(false, EXPECT_PASS);
+ }
+
+ function testAssertFalse_Fail() external {
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: Assertion Failed");
+ t._assertFalse(true, EXPECT_FAIL);
+ }
+
+ function testAssertFalse_Err_Pass() external {
+ t._assertFalse(false, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAssertFalse_Err_Fail() external {
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertFalse(true, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ ASSERT_EQ(BOOL)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertEq_Bool_Pass(bool a) external {
+ t._assertEq(a, a, EXPECT_PASS);
+ }
+
+ function testAssertEq_Bool_Fail(bool a, bool b) external {
+ vm.assume(a != b);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [bool]");
+ t._assertEq(a, b, EXPECT_FAIL);
+ }
+
+ function testAssertEq_BoolErr_Pass(bool a) external {
+ t._assertEq(a, a, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAssertEq_BoolErr_Fail(bool a, bool b) external {
+ vm.assume(a != b);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ ASSERT_EQ(BYTES)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertEq_Bytes_Pass(bytes calldata a) external {
+ t._assertEq(a, a, EXPECT_PASS);
+ }
+
+ function testAssertEq_Bytes_Fail(bytes calldata a, bytes calldata b) external {
+ vm.assume(keccak256(a) != keccak256(b));
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [bytes]");
+ t._assertEq(a, b, EXPECT_FAIL);
+ }
+
+ function testAssertEq_BytesErr_Pass(bytes calldata a) external {
+ t._assertEq(a, a, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAssertEq_BytesErr_Fail(bytes calldata a, bytes calldata b) external {
+ vm.assume(keccak256(a) != keccak256(b));
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ ASSERT_EQ(ARRAY)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertEq_UintArr_Pass(uint256 e0, uint256 e1, uint256 e2) public {
+ uint256[] memory a = new uint256[](3);
+ a[0] = e0;
+ a[1] = e1;
+ a[2] = e2;
+ uint256[] memory b = new uint256[](3);
+ b[0] = e0;
+ b[1] = e1;
+ b[2] = e2;
+
+ t._assertEq(a, b, EXPECT_PASS);
+ }
+
+ function testAssertEq_IntArr_Pass(int256 e0, int256 e1, int256 e2) public {
+ int256[] memory a = new int256[](3);
+ a[0] = e0;
+ a[1] = e1;
+ a[2] = e2;
+ int256[] memory b = new int256[](3);
+ b[0] = e0;
+ b[1] = e1;
+ b[2] = e2;
+
+ t._assertEq(a, b, EXPECT_PASS);
+ }
+
+ function testAssertEq_AddressArr_Pass(address e0, address e1, address e2) public {
+ address[] memory a = new address[](3);
+ a[0] = e0;
+ a[1] = e1;
+ a[2] = e2;
+ address[] memory b = new address[](3);
+ b[0] = e0;
+ b[1] = e1;
+ b[2] = e2;
+
+ t._assertEq(a, b, EXPECT_PASS);
+ }
+
+ function testAssertEq_UintArr_FailEl(uint256 e1) public {
+ vm.assume(e1 != 0);
+ uint256[] memory a = new uint256[](3);
+ uint256[] memory b = new uint256[](3);
+ b[1] = e1;
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [uint[]]");
+ t._assertEq(a, b, EXPECT_FAIL);
+ }
+
+ function testAssertEq_IntArr_FailEl(int256 e1) public {
+ vm.assume(e1 != 0);
+ int256[] memory a = new int256[](3);
+ int256[] memory b = new int256[](3);
+ b[1] = e1;
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [int[]]");
+ t._assertEq(a, b, EXPECT_FAIL);
+ }
+
+ function testAssertEq_AddressArr_FailEl(address e1) public {
+ vm.assume(e1 != address(0));
+ address[] memory a = new address[](3);
+ address[] memory b = new address[](3);
+ b[1] = e1;
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [address[]]");
+ t._assertEq(a, b, EXPECT_FAIL);
+ }
+
+ function testAssertEq_UintArrErr_FailEl(uint256 e1) public {
+ vm.assume(e1 != 0);
+ uint256[] memory a = new uint256[](3);
+ uint256[] memory b = new uint256[](3);
+ b[1] = e1;
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [uint[]]");
+ t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ function testAssertEq_IntArrErr_FailEl(int256 e1) public {
+ vm.assume(e1 != 0);
+ int256[] memory a = new int256[](3);
+ int256[] memory b = new int256[](3);
+ b[1] = e1;
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [int[]]");
+ t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ function testAssertEq_AddressArrErr_FailEl(address e1) public {
+ vm.assume(e1 != address(0));
+ address[] memory a = new address[](3);
+ address[] memory b = new address[](3);
+ b[1] = e1;
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [address[]]");
+ t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ function testAssertEq_UintArr_FailLen(uint256 lenA, uint256 lenB) public {
+ vm.assume(lenA != lenB);
+ vm.assume(lenA <= 10000);
+ vm.assume(lenB <= 10000);
+ uint256[] memory a = new uint256[](lenA);
+ uint256[] memory b = new uint256[](lenB);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [uint[]]");
+ t._assertEq(a, b, EXPECT_FAIL);
+ }
+
+ function testAssertEq_IntArr_FailLen(uint256 lenA, uint256 lenB) public {
+ vm.assume(lenA != lenB);
+ vm.assume(lenA <= 10000);
+ vm.assume(lenB <= 10000);
+ int256[] memory a = new int256[](lenA);
+ int256[] memory b = new int256[](lenB);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [int[]]");
+ t._assertEq(a, b, EXPECT_FAIL);
+ }
+
+ function testAssertEq_AddressArr_FailLen(uint256 lenA, uint256 lenB) public {
+ vm.assume(lenA != lenB);
+ vm.assume(lenA <= 10000);
+ vm.assume(lenB <= 10000);
+ address[] memory a = new address[](lenA);
+ address[] memory b = new address[](lenB);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [address[]]");
+ t._assertEq(a, b, EXPECT_FAIL);
+ }
+
+ function testAssertEq_UintArrErr_FailLen(uint256 lenA, uint256 lenB) public {
+ vm.assume(lenA != lenB);
+ vm.assume(lenA <= 10000);
+ vm.assume(lenB <= 10000);
+ uint256[] memory a = new uint256[](lenA);
+ uint256[] memory b = new uint256[](lenB);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [uint[]]");
+ t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ function testAssertEq_IntArrErr_FailLen(uint256 lenA, uint256 lenB) public {
+ vm.assume(lenA != lenB);
+ vm.assume(lenA <= 10000);
+ vm.assume(lenB <= 10000);
+ int256[] memory a = new int256[](lenA);
+ int256[] memory b = new int256[](lenB);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [int[]]");
+ t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ function testAssertEq_AddressArrErr_FailLen(uint256 lenA, uint256 lenB) public {
+ vm.assume(lenA != lenB);
+ vm.assume(lenA <= 10000);
+ vm.assume(lenB <= 10000);
+ address[] memory a = new address[](lenA);
+ address[] memory b = new address[](lenB);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a == b not satisfied [address[]]");
+ t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ ASSERT_EQ(UINT)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertEqUint() public {
+ assertEqUint(uint8(1), uint128(1));
+ assertEqUint(uint64(2), uint64(2));
+ }
+
+ function testFailAssertEqUint() public {
+ assertEqUint(uint64(1), uint96(2));
+ assertEqUint(uint160(3), uint160(4));
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ APPROX_EQ_ABS(UINT)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertApproxEqAbs_Uint_Pass(uint256 a, uint256 b, uint256 maxDelta) external {
+ vm.assume(stdMath.delta(a, b) <= maxDelta);
+
+ t._assertApproxEqAbs(a, b, maxDelta, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqAbs_Uint_Fail(uint256 a, uint256 b, uint256 maxDelta) external {
+ vm.assume(stdMath.delta(a, b) > maxDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a ~= b not satisfied [uint]");
+ t._assertApproxEqAbs(a, b, maxDelta, EXPECT_FAIL);
+ }
+
+ function testAssertApproxEqAbs_UintErr_Pass(uint256 a, uint256 b, uint256 maxDelta) external {
+ vm.assume(stdMath.delta(a, b) <= maxDelta);
+
+ t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqAbs_UintErr_Fail(uint256 a, uint256 b, uint256 maxDelta) external {
+ vm.assume(stdMath.delta(a, b) > maxDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ APPROX_EQ_ABS_DECIMAL(UINT)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertApproxEqAbsDecimal_Uint_Pass(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals)
+ external
+ {
+ vm.assume(stdMath.delta(a, b) <= maxDelta);
+
+ t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqAbsDecimal_Uint_Fail(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals)
+ external
+ {
+ vm.assume(stdMath.delta(a, b) > maxDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a ~= b not satisfied [uint]");
+ t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_FAIL);
+ }
+
+ function testAssertApproxEqAbsDecimal_UintErr_Pass(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals)
+ external
+ {
+ vm.assume(stdMath.delta(a, b) <= maxDelta);
+
+ t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqAbsDecimal_UintErr_Fail(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals)
+ external
+ {
+ vm.assume(stdMath.delta(a, b) > maxDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ APPROX_EQ_ABS(INT)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertApproxEqAbs_Int_Pass(int256 a, int256 b, uint256 maxDelta) external {
+ vm.assume(stdMath.delta(a, b) <= maxDelta);
+
+ t._assertApproxEqAbs(a, b, maxDelta, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqAbs_Int_Fail(int256 a, int256 b, uint256 maxDelta) external {
+ vm.assume(stdMath.delta(a, b) > maxDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a ~= b not satisfied [int]");
+ t._assertApproxEqAbs(a, b, maxDelta, EXPECT_FAIL);
+ }
+
+ function testAssertApproxEqAbs_IntErr_Pass(int256 a, int256 b, uint256 maxDelta) external {
+ vm.assume(stdMath.delta(a, b) <= maxDelta);
+
+ t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqAbs_IntErr_Fail(int256 a, int256 b, uint256 maxDelta) external {
+ vm.assume(stdMath.delta(a, b) > maxDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ APPROX_EQ_ABS_DECIMAL(INT)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertApproxEqAbsDecimal_Int_Pass(int256 a, int256 b, uint256 maxDelta, uint256 decimals) external {
+ vm.assume(stdMath.delta(a, b) <= maxDelta);
+
+ t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqAbsDecimal_Int_Fail(int256 a, int256 b, uint256 maxDelta, uint256 decimals) external {
+ vm.assume(stdMath.delta(a, b) > maxDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a ~= b not satisfied [int]");
+ t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_FAIL);
+ }
+
+ function testAssertApproxEqAbsDecimal_IntErr_Pass(int256 a, int256 b, uint256 maxDelta, uint256 decimals)
+ external
+ {
+ vm.assume(stdMath.delta(a, b) <= maxDelta);
+
+ t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqAbsDecimal_IntErr_Fail(int256 a, int256 b, uint256 maxDelta, uint256 decimals)
+ external
+ {
+ vm.assume(stdMath.delta(a, b) > maxDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ APPROX_EQ_REL(UINT)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertApproxEqRel_Uint_Pass(uint256 a, uint256 b, uint256 maxPercentDelta) external {
+ vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0);
+ vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta);
+
+ t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqRel_Uint_Fail(uint256 a, uint256 b, uint256 maxPercentDelta) external {
+ vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0);
+ vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a ~= b not satisfied [uint]");
+ t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_FAIL);
+ }
+
+ function testAssertApproxEqRel_UintErr_Pass(uint256 a, uint256 b, uint256 maxPercentDelta) external {
+ vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0);
+ vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta);
+
+ t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqRel_UintErr_Fail(uint256 a, uint256 b, uint256 maxPercentDelta) external {
+ vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0);
+ vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ APPROX_EQ_REL_DECIMAL(UINT)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertApproxEqRelDecimal_Uint_Pass(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals)
+ external
+ {
+ vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0);
+ vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta);
+
+ t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqRelDecimal_Uint_Fail(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals)
+ external
+ {
+ vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0);
+ vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a ~= b not satisfied [uint]");
+ t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_FAIL);
+ }
+
+ function testAssertApproxEqRelDecimal_UintErr_Pass(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals)
+ external
+ {
+ vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0);
+ vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta);
+
+ t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqRelDecimal_UintErr_Fail(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals)
+ external
+ {
+ vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0);
+ vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ APPROX_EQ_REL(INT)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertApproxEqRel_Int_Pass(int128 a, int128 b, uint128 maxPercentDelta) external {
+ vm.assume(b != 0);
+ vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta);
+
+ t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqRel_Int_Fail(int128 a, int128 b, uint128 maxPercentDelta) external {
+ vm.assume(b != 0);
+ vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a ~= b not satisfied [int]");
+ t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_FAIL);
+ }
+
+ function testAssertApproxEqRel_IntErr_Pass(int128 a, int128 b, uint128 maxPercentDelta) external {
+ vm.assume(b != 0);
+ vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta);
+
+ t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqRel_IntErr_Fail(int128 a, int128 b, uint128 maxPercentDelta) external {
+ vm.assume(b != 0);
+ vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ APPROX_EQ_REL_DECIMAL(INT)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertApproxEqRelDecimal_Int_Pass(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals)
+ external
+ {
+ vm.assume(b != 0);
+ vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta);
+
+ t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqRelDecimal_Int_Fail(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals)
+ external
+ {
+ vm.assume(b != 0);
+ vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a ~= b not satisfied [int]");
+ t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_FAIL);
+ }
+
+ function testAssertApproxEqRelDecimal_IntErr_Pass(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals)
+ external
+ {
+ vm.assume(b != 0);
+ vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta);
+
+ t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAssertApproxEqRelDecimal_IntErr_Fail(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals)
+ external
+ {
+ vm.assume(b != 0);
+ vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta);
+
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ ASSERT_EQ_CALL
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertEqCall_Return_Pass(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnData,
+ bool strictRevertData
+ ) external {
+ address targetA = address(new TestMockCall(returnData, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnData, SHOULD_RETURN));
+
+ t._assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData, EXPECT_PASS);
+ }
+
+ function testAssertEqCall_Return_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnDataA,
+ bytes memory returnDataB,
+ bool strictRevertData
+ ) external {
+ vm.assume(keccak256(returnDataA) != keccak256(returnDataB));
+
+ address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnDataB, SHOULD_RETURN));
+
+ vm.expectEmit(true, true, true, true);
+ emit log_named_string("Error", "Call return data does not match");
+ t._assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData, EXPECT_FAIL);
+ }
+
+ function testAssertEqCall_Revert_Pass(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory revertDataA,
+ bytes memory revertDataB
+ ) external {
+ address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT));
+ address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT));
+
+ t._assertEqCall(targetA, callDataA, targetB, callDataB, NON_STRICT_REVERT_DATA, EXPECT_PASS);
+ }
+
+ function testAssertEqCall_Revert_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory revertDataA,
+ bytes memory revertDataB
+ ) external {
+ vm.assume(keccak256(revertDataA) != keccak256(revertDataB));
+
+ address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT));
+ address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT));
+
+ vm.expectEmit(true, true, true, true);
+ emit log_named_string("Error", "Call revert data does not match");
+ t._assertEqCall(targetA, callDataA, targetB, callDataB, STRICT_REVERT_DATA, EXPECT_FAIL);
+ }
+
+ function testAssertEqCall_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnDataA,
+ bytes memory returnDataB,
+ bool strictRevertData
+ ) external {
+ address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnDataB, SHOULD_REVERT));
+
+ vm.expectEmit(true, true, true, true);
+ emit log_named_bytes(" Left call return data", returnDataA);
+ vm.expectEmit(true, true, true, true);
+ emit log_named_bytes(" Right call revert data", returnDataB);
+ t._assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData, EXPECT_FAIL);
+
+ vm.expectEmit(true, true, true, true);
+ emit log_named_bytes(" Left call revert data", returnDataB);
+ vm.expectEmit(true, true, true, true);
+ emit log_named_bytes(" Right call return data", returnDataA);
+ t._assertEqCall(targetB, callDataB, targetA, callDataA, strictRevertData, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ ASSERT_NOT_EQ(BYTES)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertNotEq_Bytes_Pass(bytes32 a, bytes32 b) external {
+ vm.assume(a != b);
+ t._assertNotEq(a, b, EXPECT_PASS);
+ }
+
+ function testAssertNotEq_Bytes_Fail(bytes32 a) external {
+ vm.expectEmit(false, false, false, true);
+ emit log("Error: a != b not satisfied [bytes32]");
+ t._assertNotEq(a, a, EXPECT_FAIL);
+ }
+
+ function testAssertNotEq_BytesErr_Pass(bytes32 a, bytes32 b) external {
+ vm.assume(a != b);
+ t._assertNotEq(a, b, CUSTOM_ERROR, EXPECT_PASS);
+ }
+
+ function testAsserNottEq_BytesErr_Fail(bytes32 a) external {
+ vm.expectEmit(false, false, false, true);
+ emit log_named_string("Error", CUSTOM_ERROR);
+ t._assertNotEq(a, a, CUSTOM_ERROR, EXPECT_FAIL);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ ASSERT_NOT_EQ(UINT)
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testAssertNotEqUint() public {
+ assertNotEq(uint8(1), uint128(2));
+ assertNotEq(uint64(3), uint64(4));
+ }
+
+ function testFailAssertNotEqUint() public {
+ assertNotEq(uint64(1), uint96(1));
+ assertNotEq(uint160(2), uint160(2));
+ }
+}
+
+contract TestTest is Test {
+ modifier expectFailure(bool expectFail) {
+ bool preState = vm.load(HEVM_ADDRESS, bytes32("failed")) != bytes32(0x00);
+ _;
+ bool postState = vm.load(HEVM_ADDRESS, bytes32("failed")) != bytes32(0x00);
+
+ if (preState == true) {
+ return;
+ }
+
+ if (expectFail) {
+ require(postState == true, "expected failure not triggered");
+
+ // unwind the expected failure
+ vm.store(HEVM_ADDRESS, bytes32("failed"), bytes32(uint256(0x00)));
+ } else {
+ require(postState == false, "unexpected failure was triggered");
+ }
+ }
+
+ function _fail(string memory err) external expectFailure(true) {
+ fail(err);
+ }
+
+ function _assertFalse(bool data, bool expectFail) external expectFailure(expectFail) {
+ assertFalse(data);
+ }
+
+ function _assertFalse(bool data, string memory err, bool expectFail) external expectFailure(expectFail) {
+ assertFalse(data, err);
+ }
+
+ function _assertEq(bool a, bool b, bool expectFail) external expectFailure(expectFail) {
+ assertEq(a, b);
+ }
+
+ function _assertEq(bool a, bool b, string memory err, bool expectFail) external expectFailure(expectFail) {
+ assertEq(a, b, err);
+ }
+
+ function _assertEq(bytes memory a, bytes memory b, bool expectFail) external expectFailure(expectFail) {
+ assertEq(a, b);
+ }
+
+ function _assertEq(bytes memory a, bytes memory b, string memory err, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertEq(a, b, err);
+ }
+
+ function _assertEq(uint256[] memory a, uint256[] memory b, bool expectFail) external expectFailure(expectFail) {
+ assertEq(a, b);
+ }
+
+ function _assertEq(int256[] memory a, int256[] memory b, bool expectFail) external expectFailure(expectFail) {
+ assertEq(a, b);
+ }
+
+ function _assertEq(address[] memory a, address[] memory b, bool expectFail) external expectFailure(expectFail) {
+ assertEq(a, b);
+ }
+
+ function _assertEq(uint256[] memory a, uint256[] memory b, string memory err, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertEq(a, b, err);
+ }
+
+ function _assertEq(int256[] memory a, int256[] memory b, string memory err, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertEq(a, b, err);
+ }
+
+ function _assertEq(address[] memory a, address[] memory b, string memory err, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertEq(a, b, err);
+ }
+
+ function _assertNotEq(bytes32 a, bytes32 b, bool expectFail) external expectFailure(expectFail) {
+ assertNotEq32(a, b);
+ }
+
+ function _assertNotEq(bytes32 a, bytes32 b, string memory err, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertNotEq32(a, b, err);
+ }
+
+ function _assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqAbs(a, b, maxDelta);
+ }
+
+ function _assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, string memory err, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqAbs(a, b, maxDelta, err);
+ }
+
+ function _assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqAbsDecimal(a, b, maxDelta, decimals);
+ }
+
+ function _assertApproxEqAbsDecimal(
+ uint256 a,
+ uint256 b,
+ uint256 maxDelta,
+ uint256 decimals,
+ string memory err,
+ bool expectFail
+ ) external expectFailure(expectFail) {
+ assertApproxEqAbsDecimal(a, b, maxDelta, decimals, err);
+ }
+
+ function _assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqAbs(a, b, maxDelta);
+ }
+
+ function _assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, string memory err, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqAbs(a, b, maxDelta, err);
+ }
+
+ function _assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqAbsDecimal(a, b, maxDelta, decimals);
+ }
+
+ function _assertApproxEqAbsDecimal(
+ int256 a,
+ int256 b,
+ uint256 maxDelta,
+ uint256 decimals,
+ string memory err,
+ bool expectFail
+ ) external expectFailure(expectFail) {
+ assertApproxEqAbsDecimal(a, b, maxDelta, decimals, err);
+ }
+
+ function _assertApproxEqRel(uint256 a, uint256 b, uint256 maxPercentDelta, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqRel(a, b, maxPercentDelta);
+ }
+
+ function _assertApproxEqRel(uint256 a, uint256 b, uint256 maxPercentDelta, string memory err, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqRel(a, b, maxPercentDelta, err);
+ }
+
+ function _assertApproxEqRelDecimal(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals);
+ }
+
+ function _assertApproxEqRelDecimal(
+ uint256 a,
+ uint256 b,
+ uint256 maxPercentDelta,
+ uint256 decimals,
+ string memory err,
+ bool expectFail
+ ) external expectFailure(expectFail) {
+ assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, err);
+ }
+
+ function _assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqRel(a, b, maxPercentDelta);
+ }
+
+ function _assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, string memory err, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqRel(a, b, maxPercentDelta, err);
+ }
+
+ function _assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals, bool expectFail)
+ external
+ expectFailure(expectFail)
+ {
+ assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals);
+ }
+
+ function _assertApproxEqRelDecimal(
+ int256 a,
+ int256 b,
+ uint256 maxPercentDelta,
+ uint256 decimals,
+ string memory err,
+ bool expectFail
+ ) external expectFailure(expectFail) {
+ assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, err);
+ }
+
+ function _assertEqCall(
+ address targetA,
+ bytes memory callDataA,
+ address targetB,
+ bytes memory callDataB,
+ bool strictRevertData,
+ bool expectFail
+ ) external expectFailure(expectFail) {
+ assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData);
+ }
+}
+
+contract TestMockCall {
+ bytes returnData;
+ bool shouldRevert;
+
+ constructor(bytes memory returnData_, bool shouldRevert_) {
+ returnData = returnData_;
+ shouldRevert = shouldRevert_;
+ }
+
+ fallback() external payable {
+ bytes memory returnData_ = returnData;
+
+ if (shouldRevert) {
+ assembly {
+ revert(add(returnData_, 0x20), mload(returnData_))
+ }
+ } else {
+ assembly {
+ return(add(returnData_, 0x20), mload(returnData_))
+ }
+ }
+ }
+}
diff --git a/election-guard/lib/forge-std/test/StdChains.t.sol b/election-guard/lib/forge-std/test/StdChains.t.sol
new file mode 100644
index 00000000..f0ede99c
--- /dev/null
+++ b/election-guard/lib/forge-std/test/StdChains.t.sol
@@ -0,0 +1,160 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import "../src/Test.sol";
+
+contract StdChainsTest is Test {
+ function testChainRpcInitialization() public {
+ // RPCs specified in `foundry.toml` should be updated.
+ assertEq(getChain(1).rpcUrl, "https://mainnet.infura.io/v3/b1d3925804e74152b316ca7da97060d3");
+ assertEq(getChain("optimism_goerli").rpcUrl, "https://goerli.optimism.io/");
+ assertEq(getChain("arbitrum_one_goerli").rpcUrl, "https://goerli-rollup.arbitrum.io/rpc/");
+
+ // Environment variables should be the next fallback
+ assertEq(getChain("arbitrum_nova").rpcUrl, "https://nova.arbitrum.io/rpc");
+ vm.setEnv("ARBITRUM_NOVA_RPC_URL", "myoverride");
+ assertEq(getChain("arbitrum_nova").rpcUrl, "myoverride");
+ vm.setEnv("ARBITRUM_NOVA_RPC_URL", "https://nova.arbitrum.io/rpc");
+
+ // Cannot override RPCs defined in `foundry.toml`
+ vm.setEnv("MAINNET_RPC_URL", "myoverride2");
+ assertEq(getChain("mainnet").rpcUrl, "https://mainnet.infura.io/v3/b1d3925804e74152b316ca7da97060d3");
+
+ // Other RPCs should remain unchanged.
+ assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545");
+ assertEq(getChain("sepolia").rpcUrl, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001");
+ }
+
+ function testRpc(string memory rpcAlias) internal {
+ string memory rpcUrl = getChain(rpcAlias).rpcUrl;
+ vm.createSelectFork(rpcUrl);
+ }
+
+ // Ensure we can connect to the default RPC URL for each chain.
+ // function testRpcs() public {
+ // testRpc("mainnet");
+ // testRpc("goerli");
+ // testRpc("sepolia");
+ // testRpc("optimism");
+ // testRpc("optimism_goerli");
+ // testRpc("arbitrum_one");
+ // testRpc("arbitrum_one_goerli");
+ // testRpc("arbitrum_nova");
+ // testRpc("polygon");
+ // testRpc("polygon_mumbai");
+ // testRpc("avalanche");
+ // testRpc("avalanche_fuji");
+ // testRpc("bnb_smart_chain");
+ // testRpc("bnb_smart_chain_testnet");
+ // testRpc("gnosis_chain");
+ // }
+
+ function testChainNoDefault() public {
+ vm.expectRevert("StdChains getChain(string): Chain with alias \"does_not_exist\" not found.");
+ getChain("does_not_exist");
+ }
+
+ function testSetChainFirstFails() public {
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain ID 31337 already used by \"anvil\".");
+ setChain("anvil2", ChainData("Anvil", 31337, "URL"));
+ }
+
+ function testChainBubbleUp() public {
+ setChain("needs_undefined_env_var", ChainData("", 123456789, ""));
+ vm.expectRevert(
+ "Failed to resolve env var `UNDEFINED_RPC_URL_PLACEHOLDER` in `${UNDEFINED_RPC_URL_PLACEHOLDER}`: environment variable not found"
+ );
+ getChain("needs_undefined_env_var");
+ }
+
+ function testCannotSetChain_ChainIdExists() public {
+ setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+
+ vm.expectRevert('StdChains setChain(string,ChainData): Chain ID 123456789 already used by "custom_chain".');
+
+ setChain("another_custom_chain", ChainData("", 123456789, ""));
+ }
+
+ function testSetChain() public {
+ setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+ Chain memory customChain = getChain("custom_chain");
+ assertEq(customChain.name, "Custom Chain");
+ assertEq(customChain.chainId, 123456789);
+ assertEq(customChain.chainAlias, "custom_chain");
+ assertEq(customChain.rpcUrl, "https://custom.chain/");
+ Chain memory chainById = getChain(123456789);
+ assertEq(chainById.name, customChain.name);
+ assertEq(chainById.chainId, customChain.chainId);
+ assertEq(chainById.chainAlias, customChain.chainAlias);
+ assertEq(chainById.rpcUrl, customChain.rpcUrl);
+ customChain.name = "Another Custom Chain";
+ customChain.chainId = 987654321;
+ setChain("another_custom_chain", customChain);
+ Chain memory anotherCustomChain = getChain("another_custom_chain");
+ assertEq(anotherCustomChain.name, "Another Custom Chain");
+ assertEq(anotherCustomChain.chainId, 987654321);
+ assertEq(anotherCustomChain.chainAlias, "another_custom_chain");
+ assertEq(anotherCustomChain.rpcUrl, "https://custom.chain/");
+ // Verify the first chain data was not overwritten
+ chainById = getChain(123456789);
+ assertEq(chainById.name, "Custom Chain");
+ assertEq(chainById.chainId, 123456789);
+ }
+
+ function testSetNoEmptyAlias() public {
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain alias cannot be the empty string.");
+ setChain("", ChainData("", 123456789, ""));
+ }
+
+ function testSetNoChainId0() public {
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain ID cannot be 0.");
+ setChain("alias", ChainData("", 0, ""));
+ }
+
+ function testGetNoChainId0() public {
+ vm.expectRevert("StdChains getChain(uint256): Chain ID cannot be 0.");
+ getChain(0);
+ }
+
+ function testGetNoEmptyAlias() public {
+ vm.expectRevert("StdChains getChain(string): Chain alias cannot be the empty string.");
+ getChain("");
+ }
+
+ function testChainIdNotFound() public {
+ vm.expectRevert("StdChains getChain(string): Chain with alias \"no_such_alias\" not found.");
+ getChain("no_such_alias");
+ }
+
+ function testChainAliasNotFound() public {
+ vm.expectRevert("StdChains getChain(uint256): Chain with ID 321 not found.");
+ getChain(321);
+ }
+
+ function testSetChain_ExistingOne() public {
+ setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+ assertEq(getChain(123456789).chainId, 123456789);
+
+ setChain("custom_chain", ChainData("Modified Chain", 999999999, "https://modified.chain/"));
+ vm.expectRevert("StdChains getChain(uint256): Chain with ID 123456789 not found.");
+ getChain(123456789);
+
+ Chain memory modifiedChain = getChain(999999999);
+ assertEq(modifiedChain.name, "Modified Chain");
+ assertEq(modifiedChain.chainId, 999999999);
+ assertEq(modifiedChain.rpcUrl, "https://modified.chain/");
+ }
+
+ function testDontUseDefaultRpcUrl() public {
+ // Should error if default RPCs flag is set to false.
+ setFallbackToDefaultRpcUrls(false);
+ vm.expectRevert(
+ "Failed to get environment variable `ANVIL_RPC_URL` as type `string`: environment variable not found"
+ );
+ getChain(31337);
+ vm.expectRevert(
+ "Failed to get environment variable `SEPOLIA_RPC_URL` as type `string`: environment variable not found"
+ );
+ getChain("sepolia");
+ }
+}
diff --git a/election-guard/lib/forge-std/test/StdCheats.t.sol b/election-guard/lib/forge-std/test/StdCheats.t.sol
new file mode 100644
index 00000000..6f4d5bb7
--- /dev/null
+++ b/election-guard/lib/forge-std/test/StdCheats.t.sol
@@ -0,0 +1,507 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import "../src/StdCheats.sol";
+import "../src/Test.sol";
+import "../src/StdJson.sol";
+
+contract StdCheatsTest is Test {
+ Bar test;
+
+ using stdJson for string;
+
+ function setUp() public {
+ test = new Bar();
+ }
+
+ function testSkip() public {
+ vm.warp(100);
+ skip(25);
+ assertEq(block.timestamp, 125);
+ }
+
+ function testRewind() public {
+ vm.warp(100);
+ rewind(25);
+ assertEq(block.timestamp, 75);
+ }
+
+ function testHoax() public {
+ hoax(address(1337));
+ test.bar{value: 100}(address(1337));
+ }
+
+ function testHoaxOrigin() public {
+ hoax(address(1337), address(1337));
+ test.origin{value: 100}(address(1337));
+ }
+
+ function testHoaxDifferentAddresses() public {
+ hoax(address(1337), address(7331));
+ test.origin{value: 100}(address(1337), address(7331));
+ }
+
+ function testStartHoax() public {
+ startHoax(address(1337));
+ test.bar{value: 100}(address(1337));
+ test.bar{value: 100}(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+
+ function testStartHoaxOrigin() public {
+ startHoax(address(1337), address(1337));
+ test.origin{value: 100}(address(1337));
+ test.origin{value: 100}(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+
+ function testChangePrankMsgSender() public {
+ vm.startPrank(address(1337));
+ test.bar(address(1337));
+ changePrank(address(0xdead));
+ test.bar(address(0xdead));
+ changePrank(address(1337));
+ test.bar(address(1337));
+ vm.stopPrank();
+ }
+
+ function testChangePrankMsgSenderAndTxOrigin() public {
+ vm.startPrank(address(1337), address(1338));
+ test.origin(address(1337), address(1338));
+ changePrank(address(0xdead), address(0xbeef));
+ test.origin(address(0xdead), address(0xbeef));
+ changePrank(address(1337), address(1338));
+ test.origin(address(1337), address(1338));
+ vm.stopPrank();
+ }
+
+ function testMakeAccountEquivalence() public {
+ Account memory account = makeAccount("1337");
+ (address addr, uint256 key) = makeAddrAndKey("1337");
+ assertEq(account.addr, addr);
+ assertEq(account.key, key);
+ }
+
+ function testMakeAddrEquivalence() public {
+ (address addr,) = makeAddrAndKey("1337");
+ assertEq(makeAddr("1337"), addr);
+ }
+
+ function testMakeAddrSigning() public {
+ (address addr, uint256 key) = makeAddrAndKey("1337");
+ bytes32 hash = keccak256("some_message");
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(key, hash);
+ assertEq(ecrecover(hash, v, r, s), addr);
+ }
+
+ function testDeal() public {
+ deal(address(this), 1 ether);
+ assertEq(address(this).balance, 1 ether);
+ }
+
+ function testDealToken() public {
+ Bar barToken = new Bar();
+ address bar = address(barToken);
+ deal(bar, address(this), 10000e18);
+ assertEq(barToken.balanceOf(address(this)), 10000e18);
+ }
+
+ function testDealTokenAdjustTotalSupply() public {
+ Bar barToken = new Bar();
+ address bar = address(barToken);
+ deal(bar, address(this), 10000e18, true);
+ assertEq(barToken.balanceOf(address(this)), 10000e18);
+ assertEq(barToken.totalSupply(), 20000e18);
+ deal(bar, address(this), 0, true);
+ assertEq(barToken.balanceOf(address(this)), 0);
+ assertEq(barToken.totalSupply(), 10000e18);
+ }
+
+ function testDealERC1155Token() public {
+ BarERC1155 barToken = new BarERC1155();
+ address bar = address(barToken);
+ dealERC1155(bar, address(this), 0, 10000e18, false);
+ assertEq(barToken.balanceOf(address(this), 0), 10000e18);
+ }
+
+ function testDealERC1155TokenAdjustTotalSupply() public {
+ BarERC1155 barToken = new BarERC1155();
+ address bar = address(barToken);
+ dealERC1155(bar, address(this), 0, 10000e18, true);
+ assertEq(barToken.balanceOf(address(this), 0), 10000e18);
+ assertEq(barToken.totalSupply(0), 20000e18);
+ dealERC1155(bar, address(this), 0, 0, true);
+ assertEq(barToken.balanceOf(address(this), 0), 0);
+ assertEq(barToken.totalSupply(0), 10000e18);
+ }
+
+ function testDealERC721Token() public {
+ BarERC721 barToken = new BarERC721();
+ address bar = address(barToken);
+ dealERC721(bar, address(2), 1);
+ assertEq(barToken.balanceOf(address(2)), 1);
+ assertEq(barToken.balanceOf(address(1)), 0);
+ dealERC721(bar, address(1), 2);
+ assertEq(barToken.balanceOf(address(1)), 1);
+ assertEq(barToken.balanceOf(bar), 1);
+ }
+
+ function testDeployCode() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""));
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ }
+
+ function testDestroyAccount() public {
+ // deploy something to destroy it
+ BarERC721 barToken = new BarERC721();
+ address bar = address(barToken);
+ vm.setNonce(bar, 10);
+ deal(bar, 100);
+
+ uint256 prevThisBalance = address(this).balance;
+ uint256 size;
+ assembly {
+ size := extcodesize(bar)
+ }
+
+ assertGt(size, 0);
+ assertEq(bar.balance, 100);
+ assertEq(vm.getNonce(bar), 10);
+
+ destroyAccount(bar, address(this));
+ assembly {
+ size := extcodesize(bar)
+ }
+ assertEq(address(this).balance, prevThisBalance + 100);
+ assertEq(vm.getNonce(bar), 0);
+ assertEq(size, 0);
+ assertEq(bar.balance, 0);
+ }
+
+ function testDeployCodeNoArgs() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar");
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ }
+
+ function testDeployCodeVal() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""), 1 ether);
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ assertEq(deployed.balance, 1 ether);
+ }
+
+ function testDeployCodeValNoArgs() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", 1 ether);
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ assertEq(deployed.balance, 1 ether);
+ }
+
+ // We need this so we can call "this.deployCode" rather than "deployCode" directly
+ function deployCodeHelper(string memory what) external {
+ deployCode(what);
+ }
+
+ function testDeployCodeFail() public {
+ vm.expectRevert(bytes("StdCheats deployCode(string): Deployment failed."));
+ this.deployCodeHelper("StdCheats.t.sol:RevertingContract");
+ }
+
+ function getCode(address who) internal view returns (bytes memory o_code) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ // retrieve the size of the code, this needs assembly
+ let size := extcodesize(who)
+ // allocate output byte array - this could also be done without assembly
+ // by using o_code = new bytes(size)
+ o_code := mload(0x40)
+ // new "memory end" including padding
+ mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f))))
+ // store length in memory
+ mstore(o_code, size)
+ // actually retrieve the code, this needs assembly
+ extcodecopy(who, add(o_code, 0x20), 0, size)
+ }
+ }
+
+ function testDeriveRememberKey() public {
+ string memory mnemonic = "test test test test test test test test test test test junk";
+
+ (address deployer, uint256 privateKey) = deriveRememberKey(mnemonic, 0);
+ assertEq(deployer, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266);
+ assertEq(privateKey, 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80);
+ }
+
+ function testBytesToUint() public {
+ assertEq(3, bytesToUint_test(hex"03"));
+ assertEq(2, bytesToUint_test(hex"02"));
+ assertEq(255, bytesToUint_test(hex"ff"));
+ assertEq(29625, bytesToUint_test(hex"73b9"));
+ }
+
+ function testParseJsonTxDetail() public {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ string memory json = vm.readFile(path);
+ bytes memory transactionDetails = json.parseRaw(".transactions[0].tx");
+ RawTx1559Detail memory rawTxDetail = abi.decode(transactionDetails, (RawTx1559Detail));
+ Tx1559Detail memory txDetail = rawToConvertedEIP1559Detail(rawTxDetail);
+ assertEq(txDetail.from, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266);
+ assertEq(txDetail.to, 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512);
+ assertEq(
+ txDetail.data,
+ hex"23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004"
+ );
+ assertEq(txDetail.nonce, 3);
+ assertEq(txDetail.txType, 2);
+ assertEq(txDetail.gas, 29625);
+ assertEq(txDetail.value, 0);
+ }
+
+ function testReadEIP1559Transaction() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ uint256 index = 0;
+ Tx1559 memory transaction = readTx1559(path, index);
+ transaction;
+ }
+
+ function testReadEIP1559Transactions() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ Tx1559[] memory transactions = readTx1559s(path);
+ transactions;
+ }
+
+ function testReadReceipt() public {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ uint256 index = 5;
+ Receipt memory receipt = readReceipt(path, index);
+ assertEq(
+ receipt.logsBloom,
+ hex"00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"
+ );
+ }
+
+ function testReadReceipts() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ Receipt[] memory receipts = readReceipts(path);
+ receipts;
+ }
+
+ function testGasMeteringModifier() public {
+ uint256 gas_start_normal = gasleft();
+ addInLoop();
+ uint256 gas_used_normal = gas_start_normal - gasleft();
+
+ uint256 gas_start_single = gasleft();
+ addInLoopNoGas();
+ uint256 gas_used_single = gas_start_single - gasleft();
+
+ uint256 gas_start_double = gasleft();
+ addInLoopNoGasNoGas();
+ uint256 gas_used_double = gas_start_double - gasleft();
+
+ emit log_named_uint("Normal gas", gas_used_normal);
+ emit log_named_uint("Single modifier gas", gas_used_single);
+ emit log_named_uint("Double modifier gas", gas_used_double);
+ assertTrue(gas_used_double + gas_used_single < gas_used_normal);
+ }
+
+ function addInLoop() internal pure returns (uint256) {
+ uint256 b;
+ for (uint256 i; i < 10000; i++) {
+ b += i;
+ }
+ return b;
+ }
+
+ function addInLoopNoGas() internal noGasMetering returns (uint256) {
+ return addInLoop();
+ }
+
+ function addInLoopNoGasNoGas() internal noGasMetering returns (uint256) {
+ return addInLoopNoGas();
+ }
+
+ function bytesToUint_test(bytes memory b) private pure returns (uint256) {
+ uint256 number;
+ for (uint256 i = 0; i < b.length; i++) {
+ number = number + uint256(uint8(b[i])) * (2 ** (8 * (b.length - (i + 1))));
+ }
+ return number;
+ }
+
+ function testAssumeNoPrecompiles(address addr) external {
+ assumeNoPrecompiles(addr, getChain("optimism_goerli").chainId);
+ assertTrue(
+ addr < address(1) || (addr > address(9) && addr < address(0x4200000000000000000000000000000000000000))
+ || addr > address(0x4200000000000000000000000000000000000800)
+ );
+ }
+
+ function testAssumePayable() external {
+ // all should revert since these addresses are not payable
+
+ // VM address
+ vm.expectRevert();
+ assumePayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
+
+ // Console address
+ vm.expectRevert();
+ assumePayable(0x000000000000000000636F6e736F6c652e6c6f67);
+
+ // Create2Deployer
+ vm.expectRevert();
+ assumePayable(0x4e59b44847b379578588920cA78FbF26c0B4956C);
+ }
+
+ function testAssumePayable(address addr) external {
+ assumePayable(addr);
+ assertTrue(
+ addr != 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D && addr != 0x000000000000000000636F6e736F6c652e6c6f67
+ && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C
+ );
+ }
+}
+
+contract StdCheatsMock is StdCheats {
+ // We deploy a mock version so we can properly test expected reverts.
+ function assumeNoBlacklisted_(address token, address addr) external {
+ return assumeNoBlacklisted(token, addr);
+ }
+}
+
+contract StdCheatsForkTest is Test {
+ address internal constant SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE;
+ address internal constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
+ address internal constant USDC_BLACKLISTED_USER = 0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD;
+ address internal constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
+ address internal constant USDT_BLACKLISTED_USER = 0x8f8a8F4B54a2aAC7799d7bc81368aC27b852822A;
+
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock private stdCheats = new StdCheatsMock();
+
+ function setUp() public {
+ // All tests of the `assumeNoBlacklisted` method are fork tests using live contracts.
+ vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900});
+ }
+
+ function testCannotAssumeNoBlacklisted_EOA() external {
+ address eoa = vm.addr({privateKey: 1});
+ vm.expectRevert("StdCheats assumeNoBlacklisted(address,address): Token address is not a contract.");
+ assumeNoBlacklisted(eoa, address(0));
+ }
+
+ function testAssumeNoBlacklisted_TokenWithoutBlacklist(address addr) external {
+ assumeNoBlacklisted(SHIB, addr);
+ assertTrue(true);
+ }
+
+ function testAssumeNoBlacklisted_USDC() external {
+ vm.expectRevert();
+ stdCheats.assumeNoBlacklisted_(USDC, USDC_BLACKLISTED_USER);
+ }
+
+ function testAssumeNoBlacklisted_USDC(address addr) external {
+ assumeNoBlacklisted(USDC, addr);
+ assertFalse(USDCLike(USDC).isBlacklisted(addr));
+ }
+
+ function testAssumeNoBlacklisted_USDT() external {
+ vm.expectRevert();
+ stdCheats.assumeNoBlacklisted_(USDT, USDT_BLACKLISTED_USER);
+ }
+
+ function testAssumeNoBlacklisted_USDT(address addr) external {
+ assumeNoBlacklisted(USDT, addr);
+ assertFalse(USDTLike(USDT).isBlackListed(addr));
+ }
+}
+
+contract Bar {
+ constructor() payable {
+ /// `DEAL` STDCHEAT
+ totalSupply = 10000e18;
+ balanceOf[address(this)] = totalSupply;
+ }
+
+ /// `HOAX` and `CHANGEPRANK` STDCHEATS
+ function bar(address expectedSender) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ }
+
+ function origin(address expectedSender) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ require(tx.origin == expectedSender, "!prank");
+ }
+
+ function origin(address expectedSender, address expectedOrigin) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ require(tx.origin == expectedOrigin, "!prank");
+ }
+
+ /// `DEAL` STDCHEAT
+ mapping(address => uint256) public balanceOf;
+ uint256 public totalSupply;
+}
+
+contract BarERC1155 {
+ constructor() payable {
+ /// `DEALERC1155` STDCHEAT
+ _totalSupply[0] = 10000e18;
+ _balances[0][address(this)] = _totalSupply[0];
+ }
+
+ function balanceOf(address account, uint256 id) public view virtual returns (uint256) {
+ return _balances[id][account];
+ }
+
+ function totalSupply(uint256 id) public view virtual returns (uint256) {
+ return _totalSupply[id];
+ }
+
+ /// `DEALERC1155` STDCHEAT
+ mapping(uint256 => mapping(address => uint256)) private _balances;
+ mapping(uint256 => uint256) private _totalSupply;
+}
+
+contract BarERC721 {
+ constructor() payable {
+ /// `DEALERC721` STDCHEAT
+ _owners[1] = address(1);
+ _balances[address(1)] = 1;
+ _owners[2] = address(this);
+ _owners[3] = address(this);
+ _balances[address(this)] = 2;
+ }
+
+ function balanceOf(address owner) public view virtual returns (uint256) {
+ return _balances[owner];
+ }
+
+ function ownerOf(uint256 tokenId) public view virtual returns (address) {
+ address owner = _owners[tokenId];
+ return owner;
+ }
+
+ mapping(uint256 => address) private _owners;
+ mapping(address => uint256) private _balances;
+}
+
+interface USDCLike {
+ function isBlacklisted(address) external view returns (bool);
+}
+
+interface USDTLike {
+ function isBlackListed(address) external view returns (bool);
+}
+
+contract RevertingContract {
+ constructor() {
+ revert();
+ }
+}
diff --git a/election-guard/lib/forge-std/test/StdError.t.sol b/election-guard/lib/forge-std/test/StdError.t.sol
new file mode 100644
index 00000000..ccd3efac
--- /dev/null
+++ b/election-guard/lib/forge-std/test/StdError.t.sol
@@ -0,0 +1,118 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.8.0 <0.9.0;
+
+import "../src/StdError.sol";
+import "../src/Test.sol";
+
+contract StdErrorsTest is Test {
+ ErrorsTest test;
+
+ function setUp() public {
+ test = new ErrorsTest();
+ }
+
+ function testExpectAssertion() public {
+ vm.expectRevert(stdError.assertionError);
+ test.assertionError();
+ }
+
+ function testExpectArithmetic() public {
+ vm.expectRevert(stdError.arithmeticError);
+ test.arithmeticError(10);
+ }
+
+ function testExpectDiv() public {
+ vm.expectRevert(stdError.divisionError);
+ test.divError(0);
+ }
+
+ function testExpectMod() public {
+ vm.expectRevert(stdError.divisionError);
+ test.modError(0);
+ }
+
+ function testExpectEnum() public {
+ vm.expectRevert(stdError.enumConversionError);
+ test.enumConversion(1);
+ }
+
+ function testExpectEncodeStg() public {
+ vm.expectRevert(stdError.encodeStorageError);
+ test.encodeStgError();
+ }
+
+ function testExpectPop() public {
+ vm.expectRevert(stdError.popError);
+ test.pop();
+ }
+
+ function testExpectOOB() public {
+ vm.expectRevert(stdError.indexOOBError);
+ test.indexOOBError(1);
+ }
+
+ function testExpectMem() public {
+ vm.expectRevert(stdError.memOverflowError);
+ test.mem();
+ }
+
+ function testExpectIntern() public {
+ vm.expectRevert(stdError.zeroVarError);
+ test.intern();
+ }
+}
+
+contract ErrorsTest {
+ enum T {T1}
+
+ uint256[] public someArr;
+ bytes someBytes;
+
+ function assertionError() public pure {
+ assert(false);
+ }
+
+ function arithmeticError(uint256 a) public pure {
+ a -= 100;
+ }
+
+ function divError(uint256 a) public pure {
+ 100 / a;
+ }
+
+ function modError(uint256 a) public pure {
+ 100 % a;
+ }
+
+ function enumConversion(uint256 a) public pure {
+ T(a);
+ }
+
+ function encodeStgError() public {
+ /// @solidity memory-safe-assembly
+ assembly {
+ sstore(someBytes.slot, 1)
+ }
+ keccak256(someBytes);
+ }
+
+ function pop() public {
+ someArr.pop();
+ }
+
+ function indexOOBError(uint256 a) public pure {
+ uint256[] memory t = new uint256[](0);
+ t[a];
+ }
+
+ function mem() public pure {
+ uint256 l = 2 ** 256 / 32;
+ new uint256[](l);
+ }
+
+ function intern() public returns (uint256) {
+ function(uint256) internal returns (uint256) x;
+ x(2);
+ return 7;
+ }
+}
diff --git a/election-guard/lib/forge-std/test/StdMath.t.sol b/election-guard/lib/forge-std/test/StdMath.t.sol
new file mode 100644
index 00000000..95037ea5
--- /dev/null
+++ b/election-guard/lib/forge-std/test/StdMath.t.sol
@@ -0,0 +1,197 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.8.0 <0.9.0;
+
+import "../src/StdMath.sol";
+import "../src/Test.sol";
+
+contract StdMathTest is Test {
+ function testGetAbs() external {
+ assertEq(stdMath.abs(-50), 50);
+ assertEq(stdMath.abs(50), 50);
+ assertEq(stdMath.abs(-1337), 1337);
+ assertEq(stdMath.abs(0), 0);
+
+ assertEq(stdMath.abs(type(int256).min), (type(uint256).max >> 1) + 1);
+ assertEq(stdMath.abs(type(int256).max), (type(uint256).max >> 1));
+ }
+
+ function testGetAbs_Fuzz(int256 a) external {
+ uint256 manualAbs = getAbs(a);
+
+ uint256 abs = stdMath.abs(a);
+
+ assertEq(abs, manualAbs);
+ }
+
+ function testGetDelta_Uint() external {
+ assertEq(stdMath.delta(uint256(0), uint256(0)), 0);
+ assertEq(stdMath.delta(uint256(0), uint256(1337)), 1337);
+ assertEq(stdMath.delta(uint256(0), type(uint64).max), type(uint64).max);
+ assertEq(stdMath.delta(uint256(0), type(uint128).max), type(uint128).max);
+ assertEq(stdMath.delta(uint256(0), type(uint256).max), type(uint256).max);
+
+ assertEq(stdMath.delta(0, uint256(0)), 0);
+ assertEq(stdMath.delta(1337, uint256(0)), 1337);
+ assertEq(stdMath.delta(type(uint64).max, uint256(0)), type(uint64).max);
+ assertEq(stdMath.delta(type(uint128).max, uint256(0)), type(uint128).max);
+ assertEq(stdMath.delta(type(uint256).max, uint256(0)), type(uint256).max);
+
+ assertEq(stdMath.delta(1337, uint256(1337)), 0);
+ assertEq(stdMath.delta(type(uint256).max, type(uint256).max), 0);
+ assertEq(stdMath.delta(5000, uint256(1250)), 3750);
+ }
+
+ function testGetDelta_Uint_Fuzz(uint256 a, uint256 b) external {
+ uint256 manualDelta;
+ if (a > b) {
+ manualDelta = a - b;
+ } else {
+ manualDelta = b - a;
+ }
+
+ uint256 delta = stdMath.delta(a, b);
+
+ assertEq(delta, manualDelta);
+ }
+
+ function testGetDelta_Int() external {
+ assertEq(stdMath.delta(int256(0), int256(0)), 0);
+ assertEq(stdMath.delta(int256(0), int256(1337)), 1337);
+ assertEq(stdMath.delta(int256(0), type(int64).max), type(uint64).max >> 1);
+ assertEq(stdMath.delta(int256(0), type(int128).max), type(uint128).max >> 1);
+ assertEq(stdMath.delta(int256(0), type(int256).max), type(uint256).max >> 1);
+
+ assertEq(stdMath.delta(0, int256(0)), 0);
+ assertEq(stdMath.delta(1337, int256(0)), 1337);
+ assertEq(stdMath.delta(type(int64).max, int256(0)), type(uint64).max >> 1);
+ assertEq(stdMath.delta(type(int128).max, int256(0)), type(uint128).max >> 1);
+ assertEq(stdMath.delta(type(int256).max, int256(0)), type(uint256).max >> 1);
+
+ assertEq(stdMath.delta(-0, int256(0)), 0);
+ assertEq(stdMath.delta(-1337, int256(0)), 1337);
+ assertEq(stdMath.delta(type(int64).min, int256(0)), (type(uint64).max >> 1) + 1);
+ assertEq(stdMath.delta(type(int128).min, int256(0)), (type(uint128).max >> 1) + 1);
+ assertEq(stdMath.delta(type(int256).min, int256(0)), (type(uint256).max >> 1) + 1);
+
+ assertEq(stdMath.delta(int256(0), -0), 0);
+ assertEq(stdMath.delta(int256(0), -1337), 1337);
+ assertEq(stdMath.delta(int256(0), type(int64).min), (type(uint64).max >> 1) + 1);
+ assertEq(stdMath.delta(int256(0), type(int128).min), (type(uint128).max >> 1) + 1);
+ assertEq(stdMath.delta(int256(0), type(int256).min), (type(uint256).max >> 1) + 1);
+
+ assertEq(stdMath.delta(1337, int256(1337)), 0);
+ assertEq(stdMath.delta(type(int256).max, type(int256).max), 0);
+ assertEq(stdMath.delta(type(int256).min, type(int256).min), 0);
+ assertEq(stdMath.delta(type(int256).min, type(int256).max), type(uint256).max);
+ assertEq(stdMath.delta(5000, int256(1250)), 3750);
+ }
+
+ function testGetDelta_Int_Fuzz(int256 a, int256 b) external {
+ uint256 absA = getAbs(a);
+ uint256 absB = getAbs(b);
+ uint256 absDelta = absA > absB ? absA - absB : absB - absA;
+
+ uint256 manualDelta;
+ if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) {
+ manualDelta = absDelta;
+ }
+ // (a < 0 && b >= 0) || (a >= 0 && b < 0)
+ else {
+ manualDelta = absA + absB;
+ }
+
+ uint256 delta = stdMath.delta(a, b);
+
+ assertEq(delta, manualDelta);
+ }
+
+ function testGetPercentDelta_Uint() external {
+ assertEq(stdMath.percentDelta(uint256(0), uint256(1337)), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint64).max), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint128).max), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint192).max), 1e18);
+
+ assertEq(stdMath.percentDelta(1337, uint256(1337)), 0);
+ assertEq(stdMath.percentDelta(type(uint192).max, type(uint192).max), 0);
+ assertEq(stdMath.percentDelta(0, uint256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(2500, uint256(2500)), 0);
+ assertEq(stdMath.percentDelta(5000, uint256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(7500, uint256(2500)), 2e18);
+
+ vm.expectRevert(stdError.divisionError);
+ stdMath.percentDelta(uint256(1), 0);
+ }
+
+ function testGetPercentDelta_Uint_Fuzz(uint192 a, uint192 b) external {
+ vm.assume(b != 0);
+ uint256 manualDelta;
+ if (a > b) {
+ manualDelta = a - b;
+ } else {
+ manualDelta = b - a;
+ }
+
+ uint256 manualPercentDelta = manualDelta * 1e18 / b;
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ assertEq(percentDelta, manualPercentDelta);
+ }
+
+ function testGetPercentDelta_Int() external {
+ assertEq(stdMath.percentDelta(int256(0), int256(1337)), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), -1337), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int64).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int128).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int192).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int64).max), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int128).max), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int192).max), 1e18);
+
+ assertEq(stdMath.percentDelta(1337, int256(1337)), 0);
+ assertEq(stdMath.percentDelta(type(int192).max, type(int192).max), 0);
+ assertEq(stdMath.percentDelta(type(int192).min, type(int192).min), 0);
+
+ assertEq(stdMath.percentDelta(type(int192).min, type(int192).max), 2e18); // rounds the 1 wei diff down
+ assertEq(stdMath.percentDelta(type(int192).max, type(int192).min), 2e18 - 1); // rounds the 1 wei diff down
+ assertEq(stdMath.percentDelta(0, int256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(2500, int256(2500)), 0);
+ assertEq(stdMath.percentDelta(5000, int256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(7500, int256(2500)), 2e18);
+
+ vm.expectRevert(stdError.divisionError);
+ stdMath.percentDelta(int256(1), 0);
+ }
+
+ function testGetPercentDelta_Int_Fuzz(int192 a, int192 b) external {
+ vm.assume(b != 0);
+ uint256 absA = getAbs(a);
+ uint256 absB = getAbs(b);
+ uint256 absDelta = absA > absB ? absA - absB : absB - absA;
+
+ uint256 manualDelta;
+ if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) {
+ manualDelta = absDelta;
+ }
+ // (a < 0 && b >= 0) || (a >= 0 && b < 0)
+ else {
+ manualDelta = absA + absB;
+ }
+
+ uint256 manualPercentDelta = manualDelta * 1e18 / absB;
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ assertEq(percentDelta, manualPercentDelta);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ HELPERS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function getAbs(int256 a) private pure returns (uint256) {
+ if (a < 0) {
+ return a == type(int256).min ? uint256(type(int256).max) + 1 : uint256(-a);
+ }
+
+ return uint256(a);
+ }
+}
diff --git a/election-guard/lib/forge-std/test/StdStorage.t.sol b/election-guard/lib/forge-std/test/StdStorage.t.sol
new file mode 100644
index 00000000..d4c563a0
--- /dev/null
+++ b/election-guard/lib/forge-std/test/StdStorage.t.sol
@@ -0,0 +1,283 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import "../src/StdStorage.sol";
+import "../src/Test.sol";
+
+contract StdStorageTest is Test {
+ using stdStorage for StdStorage;
+
+ StorageTest internal test;
+
+ function setUp() public {
+ test = new StorageTest();
+ }
+
+ function testStorageHidden() public {
+ assertEq(uint256(keccak256("my.random.var")), stdstore.target(address(test)).sig("hidden()").find());
+ }
+
+ function testStorageObvious() public {
+ assertEq(uint256(0), stdstore.target(address(test)).sig("exists()").find());
+ }
+
+ function testStorageCheckedWriteHidden() public {
+ stdstore.target(address(test)).sig(test.hidden.selector).checked_write(100);
+ assertEq(uint256(test.hidden()), 100);
+ }
+
+ function testStorageCheckedWriteObvious() public {
+ stdstore.target(address(test)).sig(test.exists.selector).checked_write(100);
+ assertEq(test.exists(), 100);
+ }
+
+ function testStorageMapStructA() public {
+ uint256 slot =
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), 4))), slot);
+ }
+
+ function testStorageMapStructB() public {
+ uint256 slot =
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), 4))) + 1, slot);
+ }
+
+ function testStorageDeepMap() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(
+ address(this)
+ ).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(5)))))), slot);
+ }
+
+ function testStorageCheckedWriteDeepMap() public {
+ stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(address(this))
+ .checked_write(100);
+ assertEq(100, test.deep_map(address(this), address(this)));
+ }
+
+ function testStorageDeepMapStructA() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this))
+ .with_key(address(this)).depth(0).find();
+ assertEq(
+ bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 0),
+ bytes32(slot)
+ );
+ }
+
+ function testStorageDeepMapStructB() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this))
+ .with_key(address(this)).depth(1).find();
+ assertEq(
+ bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 1),
+ bytes32(slot)
+ );
+ }
+
+ function testStorageCheckedWriteDeepMapStructA() public {
+ stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key(
+ address(this)
+ ).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this));
+ assertEq(100, a);
+ assertEq(0, b);
+ }
+
+ function testStorageCheckedWriteDeepMapStructB() public {
+ stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key(
+ address(this)
+ ).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this));
+ assertEq(0, a);
+ assertEq(100, b);
+ }
+
+ function testStorageCheckedWriteMapStructA() public {
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.map_struct(address(this));
+ assertEq(a, 100);
+ assertEq(b, 0);
+ }
+
+ function testStorageCheckedWriteMapStructB() public {
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.map_struct(address(this));
+ assertEq(a, 0);
+ assertEq(b, 100);
+ }
+
+ function testStorageStructA() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(0).find();
+ assertEq(uint256(7), slot);
+ }
+
+ function testStorageStructB() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(1).find();
+ assertEq(uint256(7) + 1, slot);
+ }
+
+ function testStorageCheckedWriteStructA() public {
+ stdstore.target(address(test)).sig(test.basic.selector).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.basic();
+ assertEq(a, 100);
+ assertEq(b, 1337);
+ }
+
+ function testStorageCheckedWriteStructB() public {
+ stdstore.target(address(test)).sig(test.basic.selector).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.basic();
+ assertEq(a, 1337);
+ assertEq(b, 100);
+ }
+
+ function testStorageMapAddrFound() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), uint256(1)))), slot);
+ }
+
+ function testStorageMapUintFound() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).find();
+ assertEq(uint256(keccak256(abi.encode(100, uint256(2)))), slot);
+ }
+
+ function testStorageCheckedWriteMapUint() public {
+ stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).checked_write(100);
+ assertEq(100, test.map_uint(100));
+ }
+
+ function testStorageCheckedWriteMapAddr() public {
+ stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).checked_write(100);
+ assertEq(100, test.map_addr(address(this)));
+ }
+
+ function testStorageCheckedWriteMapBool() public {
+ stdstore.target(address(test)).sig(test.map_bool.selector).with_key(address(this)).checked_write(true);
+ assertTrue(test.map_bool(address(this)));
+ }
+
+ function testFailStorageCheckedWriteMapPacked() public {
+ // expect PackedSlot error but not external call so cant expectRevert
+ stdstore.target(address(test)).sig(test.read_struct_lower.selector).with_key(address(uint160(1337)))
+ .checked_write(100);
+ }
+
+ function testStorageCheckedWriteMapPackedSuccess() public {
+ uint256 full = test.map_packed(address(1337));
+ // keep upper 128, set lower 128 to 1337
+ full = (full & (uint256((1 << 128) - 1) << 128)) | 1337;
+ stdstore.target(address(test)).sig(test.map_packed.selector).with_key(address(uint160(1337))).checked_write(
+ full
+ );
+ assertEq(1337, test.read_struct_lower(address(1337)));
+ }
+
+ function testFailStorageConst() public {
+ // vm.expectRevert(abi.encodeWithSignature("NotStorage(bytes4)", bytes4(keccak256("const()"))));
+ stdstore.target(address(test)).sig("const()").find();
+ }
+
+ function testFailStorageNativePack() public {
+ stdstore.target(address(test)).sig(test.tA.selector).find();
+ stdstore.target(address(test)).sig(test.tB.selector).find();
+
+ // these both would fail
+ stdstore.target(address(test)).sig(test.tC.selector).find();
+ stdstore.target(address(test)).sig(test.tD.selector).find();
+ }
+
+ function testStorageReadBytes32() public {
+ bytes32 val = stdstore.target(address(test)).sig(test.tE.selector).read_bytes32();
+ assertEq(val, hex"1337");
+ }
+
+ function testStorageReadBool_False() public {
+ bool val = stdstore.target(address(test)).sig(test.tB.selector).read_bool();
+ assertEq(val, false);
+ }
+
+ function testStorageReadBool_True() public {
+ bool val = stdstore.target(address(test)).sig(test.tH.selector).read_bool();
+ assertEq(val, true);
+ }
+
+ function testStorageReadBool_Revert() public {
+ vm.expectRevert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.");
+ this.readNonBoolValue();
+ }
+
+ function readNonBoolValue() public {
+ stdstore.target(address(test)).sig(test.tE.selector).read_bool();
+ }
+
+ function testStorageReadAddress() public {
+ address val = stdstore.target(address(test)).sig(test.tF.selector).read_address();
+ assertEq(val, address(1337));
+ }
+
+ function testStorageReadUint() public {
+ uint256 val = stdstore.target(address(test)).sig(test.exists.selector).read_uint();
+ assertEq(val, 1);
+ }
+
+ function testStorageReadInt() public {
+ int256 val = stdstore.target(address(test)).sig(test.tG.selector).read_int();
+ assertEq(val, type(int256).min);
+ }
+}
+
+contract StorageTest {
+ uint256 public exists = 1;
+ mapping(address => uint256) public map_addr;
+ mapping(uint256 => uint256) public map_uint;
+ mapping(address => uint256) public map_packed;
+ mapping(address => UnpackedStruct) public map_struct;
+ mapping(address => mapping(address => uint256)) public deep_map;
+ mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct;
+ UnpackedStruct public basic;
+
+ uint248 public tA;
+ bool public tB;
+
+ bool public tC = false;
+ uint248 public tD = 1;
+
+ struct UnpackedStruct {
+ uint256 a;
+ uint256 b;
+ }
+
+ mapping(address => bool) public map_bool;
+
+ bytes32 public tE = hex"1337";
+ address public tF = address(1337);
+ int256 public tG = type(int256).min;
+ bool public tH = true;
+
+ constructor() {
+ basic = UnpackedStruct({a: 1337, b: 1337});
+
+ uint256 two = (1 << 128) | 1;
+ map_packed[msg.sender] = two;
+ map_packed[address(uint160(1337))] = 1 << 128;
+ }
+
+ function read_struct_upper(address who) public view returns (uint256) {
+ return map_packed[who] >> 128;
+ }
+
+ function read_struct_lower(address who) public view returns (uint256) {
+ return map_packed[who] & ((1 << 128) - 1);
+ }
+
+ function hidden() public view returns (bytes32 t) {
+ bytes32 slot = keccak256("my.random.var");
+ /// @solidity memory-safe-assembly
+ assembly {
+ t := sload(slot)
+ }
+ }
+
+ function const() public pure returns (bytes32 t) {
+ t = bytes32(hex"1337");
+ }
+}
diff --git a/election-guard/lib/forge-std/test/StdStyle.t.sol b/election-guard/lib/forge-std/test/StdStyle.t.sol
new file mode 100644
index 00000000..f6fffe7a
--- /dev/null
+++ b/election-guard/lib/forge-std/test/StdStyle.t.sol
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import "../src/Test.sol";
+
+contract StdStyleTest is Test {
+ function testStyleColor() public pure {
+ console2.log(StdStyle.red("StdStyle.red String Test"));
+ console2.log(StdStyle.red(uint256(10e18)));
+ console2.log(StdStyle.red(int256(-10e18)));
+ console2.log(StdStyle.red(true));
+ console2.log(StdStyle.red(address(0)));
+ console2.log(StdStyle.redBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.redBytes32("StdStyle.redBytes32"));
+ console2.log(StdStyle.green("StdStyle.green String Test"));
+ console2.log(StdStyle.green(uint256(10e18)));
+ console2.log(StdStyle.green(int256(-10e18)));
+ console2.log(StdStyle.green(true));
+ console2.log(StdStyle.green(address(0)));
+ console2.log(StdStyle.greenBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.greenBytes32("StdStyle.greenBytes32"));
+ console2.log(StdStyle.yellow("StdStyle.yellow String Test"));
+ console2.log(StdStyle.yellow(uint256(10e18)));
+ console2.log(StdStyle.yellow(int256(-10e18)));
+ console2.log(StdStyle.yellow(true));
+ console2.log(StdStyle.yellow(address(0)));
+ console2.log(StdStyle.yellowBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.yellowBytes32("StdStyle.yellowBytes32"));
+ console2.log(StdStyle.blue("StdStyle.blue String Test"));
+ console2.log(StdStyle.blue(uint256(10e18)));
+ console2.log(StdStyle.blue(int256(-10e18)));
+ console2.log(StdStyle.blue(true));
+ console2.log(StdStyle.blue(address(0)));
+ console2.log(StdStyle.blueBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.blueBytes32("StdStyle.blueBytes32"));
+ console2.log(StdStyle.magenta("StdStyle.magenta String Test"));
+ console2.log(StdStyle.magenta(uint256(10e18)));
+ console2.log(StdStyle.magenta(int256(-10e18)));
+ console2.log(StdStyle.magenta(true));
+ console2.log(StdStyle.magenta(address(0)));
+ console2.log(StdStyle.magentaBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.magentaBytes32("StdStyle.magentaBytes32"));
+ console2.log(StdStyle.cyan("StdStyle.cyan String Test"));
+ console2.log(StdStyle.cyan(uint256(10e18)));
+ console2.log(StdStyle.cyan(int256(-10e18)));
+ console2.log(StdStyle.cyan(true));
+ console2.log(StdStyle.cyan(address(0)));
+ console2.log(StdStyle.cyanBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.cyanBytes32("StdStyle.cyanBytes32"));
+ }
+
+ function testStyleFontWeight() public pure {
+ console2.log(StdStyle.bold("StdStyle.bold String Test"));
+ console2.log(StdStyle.bold(uint256(10e18)));
+ console2.log(StdStyle.bold(int256(-10e18)));
+ console2.log(StdStyle.bold(address(0)));
+ console2.log(StdStyle.bold(true));
+ console2.log(StdStyle.boldBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.boldBytes32("StdStyle.boldBytes32"));
+ console2.log(StdStyle.dim("StdStyle.dim String Test"));
+ console2.log(StdStyle.dim(uint256(10e18)));
+ console2.log(StdStyle.dim(int256(-10e18)));
+ console2.log(StdStyle.dim(address(0)));
+ console2.log(StdStyle.dim(true));
+ console2.log(StdStyle.dimBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.dimBytes32("StdStyle.dimBytes32"));
+ console2.log(StdStyle.italic("StdStyle.italic String Test"));
+ console2.log(StdStyle.italic(uint256(10e18)));
+ console2.log(StdStyle.italic(int256(-10e18)));
+ console2.log(StdStyle.italic(address(0)));
+ console2.log(StdStyle.italic(true));
+ console2.log(StdStyle.italicBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.italicBytes32("StdStyle.italicBytes32"));
+ console2.log(StdStyle.underline("StdStyle.underline String Test"));
+ console2.log(StdStyle.underline(uint256(10e18)));
+ console2.log(StdStyle.underline(int256(-10e18)));
+ console2.log(StdStyle.underline(address(0)));
+ console2.log(StdStyle.underline(true));
+ console2.log(StdStyle.underlineBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.underlineBytes32("StdStyle.underlineBytes32"));
+ console2.log(StdStyle.inverse("StdStyle.inverse String Test"));
+ console2.log(StdStyle.inverse(uint256(10e18)));
+ console2.log(StdStyle.inverse(int256(-10e18)));
+ console2.log(StdStyle.inverse(address(0)));
+ console2.log(StdStyle.inverse(true));
+ console2.log(StdStyle.inverseBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.inverseBytes32("StdStyle.inverseBytes32"));
+ }
+
+ function testStyleCombined() public pure {
+ console2.log(StdStyle.red(StdStyle.bold("Red Bold String Test")));
+ console2.log(StdStyle.green(StdStyle.dim(uint256(10e18))));
+ console2.log(StdStyle.yellow(StdStyle.italic(int256(-10e18))));
+ console2.log(StdStyle.blue(StdStyle.underline(address(0))));
+ console2.log(StdStyle.magenta(StdStyle.inverse(true)));
+ }
+
+ function testStyleCustom() public pure {
+ console2.log(h1("Custom Style 1"));
+ console2.log(h2("Custom Style 2"));
+ }
+
+ function h1(string memory a) private pure returns (string memory) {
+ return StdStyle.cyan(StdStyle.inverse(StdStyle.bold(a)));
+ }
+
+ function h2(string memory a) private pure returns (string memory) {
+ return StdStyle.magenta(StdStyle.bold(StdStyle.underline(a)));
+ }
+}
diff --git a/election-guard/lib/forge-std/test/StdUtils.t.sol b/election-guard/lib/forge-std/test/StdUtils.t.sol
new file mode 100644
index 00000000..e859124a
--- /dev/null
+++ b/election-guard/lib/forge-std/test/StdUtils.t.sol
@@ -0,0 +1,312 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import "../src/Test.sol";
+
+contract StdUtilsMock is StdUtils {
+ // We deploy a mock version so we can properly test expected reverts.
+ function getTokenBalances_(address token, address[] memory addresses)
+ external
+ returns (uint256[] memory balances)
+ {
+ return getTokenBalances(token, addresses);
+ }
+}
+
+contract StdUtilsTest is Test {
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND UINT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testBound() public {
+ assertEq(bound(uint256(5), 0, 4), 0);
+ assertEq(bound(uint256(0), 69, 69), 69);
+ assertEq(bound(uint256(0), 68, 69), 68);
+ assertEq(bound(uint256(10), 150, 190), 174);
+ assertEq(bound(uint256(300), 2800, 3200), 3107);
+ assertEq(bound(uint256(9999), 1337, 6666), 4669);
+ }
+
+ function testBound_WithinRange() public {
+ assertEq(bound(uint256(51), 50, 150), 51);
+ assertEq(bound(uint256(51), 50, 150), bound(bound(uint256(51), 50, 150), 50, 150));
+ assertEq(bound(uint256(149), 50, 150), 149);
+ assertEq(bound(uint256(149), 50, 150), bound(bound(uint256(149), 50, 150), 50, 150));
+ }
+
+ function testBound_EdgeCoverage() public {
+ assertEq(bound(uint256(0), 50, 150), 50);
+ assertEq(bound(uint256(1), 50, 150), 51);
+ assertEq(bound(uint256(2), 50, 150), 52);
+ assertEq(bound(uint256(3), 50, 150), 53);
+ assertEq(bound(type(uint256).max, 50, 150), 150);
+ assertEq(bound(type(uint256).max - 1, 50, 150), 149);
+ assertEq(bound(type(uint256).max - 2, 50, 150), 148);
+ assertEq(bound(type(uint256).max - 3, 50, 150), 147);
+ }
+
+ function testBound_DistributionIsEven(uint256 min, uint256 size) public {
+ size = size % 100 + 1;
+ min = bound(min, UINT256_MAX / 2, UINT256_MAX / 2 + size);
+ uint256 max = min + size - 1;
+ uint256 result;
+
+ for (uint256 i = 1; i <= size * 4; ++i) {
+ // x > max
+ result = bound(max + i, min, max);
+ assertEq(result, min + (i - 1) % size);
+ // x < min
+ result = bound(min - i, min, max);
+ assertEq(result, max - (i - 1) % size);
+ }
+ }
+
+ function testBound(uint256 num, uint256 min, uint256 max) public {
+ if (min > max) (min, max) = (max, min);
+
+ uint256 result = bound(num, min, max);
+
+ assertGe(result, min);
+ assertLe(result, max);
+ assertEq(result, bound(result, min, max));
+ if (num >= min && num <= max) assertEq(result, num);
+ }
+
+ function testBoundUint256Max() public {
+ assertEq(bound(0, type(uint256).max - 1, type(uint256).max), type(uint256).max - 1);
+ assertEq(bound(1, type(uint256).max - 1, type(uint256).max), type(uint256).max);
+ }
+
+ function testCannotBoundMaxLessThanMin() public {
+ vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min."));
+ bound(uint256(5), 100, 10);
+ }
+
+ function testCannotBoundMaxLessThanMin(uint256 num, uint256 min, uint256 max) public {
+ vm.assume(min > max);
+ vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min."));
+ bound(num, min, max);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND INT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testBoundInt() public {
+ assertEq(bound(-3, 0, 4), 2);
+ assertEq(bound(0, -69, -69), -69);
+ assertEq(bound(0, -69, -68), -68);
+ assertEq(bound(-10, 150, 190), 154);
+ assertEq(bound(-300, 2800, 3200), 2908);
+ assertEq(bound(9999, -1337, 6666), 1995);
+ }
+
+ function testBoundInt_WithinRange() public {
+ assertEq(bound(51, -50, 150), 51);
+ assertEq(bound(51, -50, 150), bound(bound(51, -50, 150), -50, 150));
+ assertEq(bound(149, -50, 150), 149);
+ assertEq(bound(149, -50, 150), bound(bound(149, -50, 150), -50, 150));
+ }
+
+ function testBoundInt_EdgeCoverage() public {
+ assertEq(bound(type(int256).min, -50, 150), -50);
+ assertEq(bound(type(int256).min + 1, -50, 150), -49);
+ assertEq(bound(type(int256).min + 2, -50, 150), -48);
+ assertEq(bound(type(int256).min + 3, -50, 150), -47);
+ assertEq(bound(type(int256).min, 10, 150), 10);
+ assertEq(bound(type(int256).min + 1, 10, 150), 11);
+ assertEq(bound(type(int256).min + 2, 10, 150), 12);
+ assertEq(bound(type(int256).min + 3, 10, 150), 13);
+
+ assertEq(bound(type(int256).max, -50, 150), 150);
+ assertEq(bound(type(int256).max - 1, -50, 150), 149);
+ assertEq(bound(type(int256).max - 2, -50, 150), 148);
+ assertEq(bound(type(int256).max - 3, -50, 150), 147);
+ assertEq(bound(type(int256).max, -50, -10), -10);
+ assertEq(bound(type(int256).max - 1, -50, -10), -11);
+ assertEq(bound(type(int256).max - 2, -50, -10), -12);
+ assertEq(bound(type(int256).max - 3, -50, -10), -13);
+ }
+
+ function testBoundInt_DistributionIsEven(int256 min, uint256 size) public {
+ size = size % 100 + 1;
+ min = bound(min, -int256(size / 2), int256(size - size / 2));
+ int256 max = min + int256(size) - 1;
+ int256 result;
+
+ for (uint256 i = 1; i <= size * 4; ++i) {
+ // x > max
+ result = bound(max + int256(i), min, max);
+ assertEq(result, min + int256((i - 1) % size));
+ // x < min
+ result = bound(min - int256(i), min, max);
+ assertEq(result, max - int256((i - 1) % size));
+ }
+ }
+
+ function testBoundInt(int256 num, int256 min, int256 max) public {
+ if (min > max) (min, max) = (max, min);
+
+ int256 result = bound(num, min, max);
+
+ assertGe(result, min);
+ assertLe(result, max);
+ assertEq(result, bound(result, min, max));
+ if (num >= min && num <= max) assertEq(result, num);
+ }
+
+ function testBoundIntInt256Max() public {
+ assertEq(bound(0, type(int256).max - 1, type(int256).max), type(int256).max - 1);
+ assertEq(bound(1, type(int256).max - 1, type(int256).max), type(int256).max);
+ }
+
+ function testBoundIntInt256Min() public {
+ assertEq(bound(0, type(int256).min, type(int256).min + 1), type(int256).min);
+ assertEq(bound(1, type(int256).min, type(int256).min + 1), type(int256).min + 1);
+ }
+
+ function testCannotBoundIntMaxLessThanMin() public {
+ vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min."));
+ bound(-5, 100, 10);
+ }
+
+ function testCannotBoundIntMaxLessThanMin(int256 num, int256 min, int256 max) public {
+ vm.assume(min > max);
+ vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min."));
+ bound(num, min, max);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND PRIVATE KEY
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testBoundPrivateKey() public {
+ assertEq(boundPrivateKey(0), 1);
+ assertEq(boundPrivateKey(1), 1);
+ assertEq(boundPrivateKey(300), 300);
+ assertEq(boundPrivateKey(9999), 9999);
+ assertEq(boundPrivateKey(SECP256K1_ORDER - 1), SECP256K1_ORDER - 1);
+ assertEq(boundPrivateKey(SECP256K1_ORDER), 1);
+ assertEq(boundPrivateKey(SECP256K1_ORDER + 1), 2);
+ assertEq(boundPrivateKey(UINT256_MAX), UINT256_MAX & SECP256K1_ORDER - 1); // x&y is equivalent to x-x%y
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BYTES TO UINT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testBytesToUint() external {
+ bytes memory maxUint = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+ bytes memory two = hex"02";
+ bytes memory millionEther = hex"d3c21bcecceda1000000";
+
+ assertEq(bytesToUint(maxUint), type(uint256).max);
+ assertEq(bytesToUint(two), 2);
+ assertEq(bytesToUint(millionEther), 1_000_000 ether);
+ }
+
+ function testCannotConvertGT32Bytes() external {
+ bytes memory thirty3Bytes = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+ vm.expectRevert("StdUtils bytesToUint(bytes): Bytes length exceeds 32.");
+ bytesToUint(thirty3Bytes);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ COMPUTE CREATE ADDRESS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testComputeCreateAddress() external {
+ address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9;
+ uint256 nonce = 14;
+ address createAddress = computeCreateAddress(deployer, nonce);
+ assertEq(createAddress, 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ COMPUTE CREATE2 ADDRESS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function testComputeCreate2Address() external {
+ bytes32 salt = bytes32(uint256(31415));
+ bytes32 initcodeHash = keccak256(abi.encode(0x6080));
+ address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9;
+ address create2Address = computeCreate2Address(salt, initcodeHash, deployer);
+ assertEq(create2Address, 0xB147a5d25748fda14b463EB04B111027C290f4d3);
+ }
+
+ function testComputeCreate2AddressWithDefaultDeployer() external {
+ bytes32 salt = 0xc290c670fde54e5ef686f9132cbc8711e76a98f0333a438a92daa442c71403c0;
+ bytes32 initcodeHash = hashInitCode(hex"6080", "");
+ assertEq(initcodeHash, 0x1a578b7a4b0b5755db6d121b4118d4bc68fe170dca840c59bc922f14175a76b0);
+ address create2Address = computeCreate2Address(salt, initcodeHash);
+ assertEq(create2Address, 0xc0ffEe2198a06235aAbFffe5Db0CacF1717f5Ac6);
+ }
+}
+
+contract StdUtilsForkTest is Test {
+ /*//////////////////////////////////////////////////////////////////////////
+ GET TOKEN BALANCES
+ //////////////////////////////////////////////////////////////////////////*/
+
+ address internal SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE;
+ address internal SHIB_HOLDER_0 = 0x855F5981e831D83e6A4b4EBFCAdAa68D92333170;
+ address internal SHIB_HOLDER_1 = 0x8F509A90c2e47779cA408Fe00d7A72e359229AdA;
+ address internal SHIB_HOLDER_2 = 0x0e3bbc0D04fF62211F71f3e4C45d82ad76224385;
+
+ address internal USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
+ address internal USDC_HOLDER_0 = 0xDa9CE944a37d218c3302F6B82a094844C6ECEb17;
+ address internal USDC_HOLDER_1 = 0x3e67F4721E6d1c41a015f645eFa37BEd854fcf52;
+
+ function setUp() public {
+ // All tests of the `getTokenBalances` method are fork tests using live contracts.
+ vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900});
+ }
+
+ function testCannotGetTokenBalances_NonTokenContract() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ // The UniswapV2Factory contract has neither a `balanceOf` function nor a fallback function,
+ // so the `balanceOf` call should revert.
+ address token = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
+ address[] memory addresses = new address[](1);
+ addresses[0] = USDC_HOLDER_0;
+
+ vm.expectRevert("Multicall3: call failed");
+ stdUtils.getTokenBalances_(token, addresses);
+ }
+
+ function testCannotGetTokenBalances_EOA() external {
+ address eoa = vm.addr({privateKey: 1});
+ address[] memory addresses = new address[](1);
+ addresses[0] = USDC_HOLDER_0;
+ vm.expectRevert("StdUtils getTokenBalances(address,address[]): Token address is not a contract.");
+ getTokenBalances(eoa, addresses);
+ }
+
+ function testGetTokenBalances_Empty() external {
+ address[] memory addresses = new address[](0);
+ uint256[] memory balances = getTokenBalances(USDC, addresses);
+ assertEq(balances.length, 0);
+ }
+
+ function testGetTokenBalances_USDC() external {
+ address[] memory addresses = new address[](2);
+ addresses[0] = USDC_HOLDER_0;
+ addresses[1] = USDC_HOLDER_1;
+ uint256[] memory balances = getTokenBalances(USDC, addresses);
+ assertEq(balances[0], 159_000_000_000_000);
+ assertEq(balances[1], 131_350_000_000_000);
+ }
+
+ function testGetTokenBalances_SHIB() external {
+ address[] memory addresses = new address[](3);
+ addresses[0] = SHIB_HOLDER_0;
+ addresses[1] = SHIB_HOLDER_1;
+ addresses[2] = SHIB_HOLDER_2;
+ uint256[] memory balances = getTokenBalances(SHIB, addresses);
+ assertEq(balances[0], 3_323_256_285_484.42e18);
+ assertEq(balances[1], 1_271_702_771_149.99999928e18);
+ assertEq(balances[2], 606_357_106_247e18);
+ }
+}
diff --git a/election-guard/lib/forge-std/test/compilation/CompilationScript.sol b/election-guard/lib/forge-std/test/compilation/CompilationScript.sol
new file mode 100644
index 00000000..e205cfff
--- /dev/null
+++ b/election-guard/lib/forge-std/test/compilation/CompilationScript.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import "../../src/Script.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationScript is Script {}
diff --git a/election-guard/lib/forge-std/test/compilation/CompilationScriptBase.sol b/election-guard/lib/forge-std/test/compilation/CompilationScriptBase.sol
new file mode 100644
index 00000000..ce8e0e95
--- /dev/null
+++ b/election-guard/lib/forge-std/test/compilation/CompilationScriptBase.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import "../../src/Script.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationScriptBase is ScriptBase {}
diff --git a/election-guard/lib/forge-std/test/compilation/CompilationTest.sol b/election-guard/lib/forge-std/test/compilation/CompilationTest.sol
new file mode 100644
index 00000000..9beeafeb
--- /dev/null
+++ b/election-guard/lib/forge-std/test/compilation/CompilationTest.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import "../../src/Test.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationTest is Test {}
diff --git a/election-guard/lib/forge-std/test/compilation/CompilationTestBase.sol b/election-guard/lib/forge-std/test/compilation/CompilationTestBase.sol
new file mode 100644
index 00000000..e993535b
--- /dev/null
+++ b/election-guard/lib/forge-std/test/compilation/CompilationTestBase.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import "../../src/Test.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationTestBase is TestBase {}
diff --git a/election-guard/lib/forge-std/test/fixtures/broadcast.log.json b/election-guard/lib/forge-std/test/fixtures/broadcast.log.json
new file mode 100644
index 00000000..0a0200bc
--- /dev/null
+++ b/election-guard/lib/forge-std/test/fixtures/broadcast.log.json
@@ -0,0 +1,187 @@
+{
+ "transactions": [
+ {
+ "hash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "function": "multiple_arguments(uint256,address,uint256[]):(uint256)",
+ "arguments": ["1", "0000000000000000000000000000000000001337", "[3,4]"],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "gas": "0x73b9",
+ "value": "0x0",
+ "data": "0x23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004",
+ "nonce": "0x3",
+ "accessList": []
+ }
+ },
+ {
+ "hash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "function": "inc():(uint256)",
+ "arguments": [],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "gas": "0xdcb2",
+ "value": "0x0",
+ "data": "0x371303c0",
+ "nonce": "0x4",
+ "accessList": []
+ }
+ },
+ {
+ "hash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "function": "t(uint256):(uint256)",
+ "arguments": ["1"],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "gas": "0x8599",
+ "value": "0x0",
+ "data": "0xafe29f710000000000000000000000000000000000000000000000000000000000000001",
+ "nonce": "0x5",
+ "accessList": []
+ }
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x481dc86e40bba90403c76f8e144aa9ff04c1da2164299d0298573835f0991181",
+ "transactionIndex": "0x0",
+ "blockHash": "0xef0730448490304e5403be0fa8f8ce64f118e9adcca60c07a2ae1ab921d748af",
+ "blockNumber": "0x1",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": null,
+ "cumulativeGasUsed": "0x13f3a",
+ "gasUsed": "0x13f3a",
+ "contractAddress": "0x5fbdb2315678afecb367f032d93f642f64180aa3",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x6a187183545b8a9e7f1790e847139379bf5622baff2cb43acf3f5c79470af782",
+ "transactionIndex": "0x0",
+ "blockHash": "0xf3acb96a90071640c2a8c067ae4e16aad87e634ea8d8bbbb5b352fba86ba0148",
+ "blockNumber": "0x2",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": null,
+ "cumulativeGasUsed": "0x45d80",
+ "gasUsed": "0x45d80",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x064ad173b4867bdef2fb60060bbdaf01735fbf10414541ea857772974e74ea9d",
+ "transactionIndex": "0x0",
+ "blockHash": "0x8373d02109d3ee06a0225f23da4c161c656ccc48fe0fcee931d325508ae73e58",
+ "blockNumber": "0x3",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
+ "cumulativeGasUsed": "0x45feb",
+ "gasUsed": "0x45feb",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f",
+ "transactionIndex": "0x0",
+ "blockHash": "0x16712fae5c0e18f75045f84363fb6b4d9a9fe25e660c4ce286833a533c97f629",
+ "blockNumber": "0x4",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "cumulativeGasUsed": "0x5905",
+ "gasUsed": "0x5905",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298",
+ "transactionIndex": "0x0",
+ "blockHash": "0x156b88c3eb9a1244ba00a1834f3f70de735b39e3e59006dd03af4fe7d5480c11",
+ "blockNumber": "0x5",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "cumulativeGasUsed": "0xa9c4",
+ "gasUsed": "0xa9c4",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "transactionIndex": "0x0",
+ "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb",
+ "blockNumber": "0x6",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "cumulativeGasUsed": "0x66c5",
+ "gasUsed": "0x66c5",
+ "contractAddress": null,
+ "logs": [
+ {
+ "address": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "topics": [
+ "0x0b2e13ff20ac7b474198655583edf70dedd2c1dc980e329c4fbb2fc0748b796b"
+ ],
+ "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000",
+ "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb",
+ "blockNumber": "0x6",
+ "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "transactionIndex": "0x1",
+ "logIndex": "0x0",
+ "transactionLogIndex": "0x0",
+ "removed": false
+ }
+ ],
+ "status": "0x1",
+ "logsBloom": "0x00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x11fbb10230c168ca1e36a7e5c69a6dbcd04fd9e64ede39d10a83e36ee8065c16",
+ "transactionIndex": "0x0",
+ "blockHash": "0xf1e0ed2eda4e923626ec74621006ed50b3fc27580dc7b4cf68a07ca77420e29c",
+ "blockNumber": "0x7",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x0000000000000000000000000000000000001337",
+ "cumulativeGasUsed": "0x5208",
+ "gasUsed": "0x5208",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ }
+ ],
+ "libraries": [
+ "src/Broadcast.t.sol:F:0x5fbdb2315678afecb367f032d93f642f64180aa3"
+ ],
+ "pending": [],
+ "path": "broadcast/Broadcast.t.sol/31337/run-latest.json",
+ "returns": {},
+ "timestamp": 1655140035
+}
diff --git a/election-guard/lib/safe-contracts b/election-guard/lib/safe-contracts
new file mode 160000
index 00000000..47a3620e
--- /dev/null
+++ b/election-guard/lib/safe-contracts
@@ -0,0 +1 @@
+Subproject commit 47a3620ed937c780d26ff218b76edaaef658f7e2
diff --git a/election-guard/script/ElectionGuard.s.sol b/election-guard/script/ElectionGuard.s.sol
new file mode 100644
index 00000000..47c4fa7b
--- /dev/null
+++ b/election-guard/script/ElectionGuard.s.sol
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+import "forge-std/Script.sol";
+import {DebugTransactionGuard} from '../src/ElectionGuard.sol';
+
+contract GuardScript is Script {
+ function setUp() public {
+ }
+
+ function run() public {
+ vm.startBroadcast();
+ new DebugTransactionGuard();
+
+
+ vm.stopBroadcast();
+ }
+}
diff --git a/election-guard/script/ZkBallot.s.sol b/election-guard/script/ZkBallot.s.sol
new file mode 100644
index 00000000..49ca97ed
--- /dev/null
+++ b/election-guard/script/ZkBallot.s.sol
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+import "forge-std/Script.sol";
+import {ZkBallot} from '../src/ZkBallot.sol';
+
+contract ZkBallotScript is Script {
+ function setUp() public {
+ }
+
+ function run() public {
+ vm.startBroadcast();
+ new ZkBallot();
+
+ vm.stopBroadcast();
+ }
+}
diff --git a/election-guard/setup/.env.example b/election-guard/setup/.env.example
new file mode 100644
index 00000000..1d583102
--- /dev/null
+++ b/election-guard/setup/.env.example
@@ -0,0 +1,2 @@
+PRIVATE_KEY=
+RPC_URL=
\ No newline at end of file
diff --git a/election-guard/setup/.env.gnosis b/election-guard/setup/.env.gnosis
new file mode 100644
index 00000000..5798c2c1
--- /dev/null
+++ b/election-guard/setup/.env.gnosis
@@ -0,0 +1,5 @@
+RPC_URL=https://rpc.gnosischain.com
+PRIVATE_KEY=0x7cdef3ac1501bc26efbebb1b38b89cb484c03f8919748fa9004be79a2cdd4a74
+SAFE_ADDRESS=0x7ace1Be0FE5E4016706e005e4785cb43B2daF4F8
+GUARD_ADDRESS=0xf345cf6240960A79CFb0ee1Db8A42f6A92e52ee3
+TX_SERVICE_URL=https://safe-transaction-gnosis.safe.global
diff --git a/election-guard/setup/.gitignore b/election-guard/setup/.gitignore
new file mode 100644
index 00000000..437d1435
--- /dev/null
+++ b/election-guard/setup/.gitignore
@@ -0,0 +1,2 @@
+.env.goerli
+node_modules
\ No newline at end of file
diff --git a/election-guard/setup/index.js b/election-guard/setup/index.js
new file mode 100644
index 00000000..eef3fbb7
--- /dev/null
+++ b/election-guard/setup/index.js
@@ -0,0 +1,42 @@
+// import Safe from '@safe-global/safe-core-sdk';
+// import SafeApiKit from '@safe-global/api-kit';
+import { ethers } from 'ethers';
+import Safe, { EthersAdapter } from '@safe-global/protocol-kit'; //dropped Safe import
+import dotenv from 'dotenv';
+
+// dotenv.config({ path: `.env.goerli` });
+dotenv.config({ path: `.env.gnosis` });
+
+const networkConfig = process.env;
+
+const safeAddress = networkConfig.SAFE_ADDRESS; // Goerli testnet
+const guardAddress = networkConfig.GUARD_ADDRESS; //debug tx guard
+const txServiceUrl = networkConfig.TX_SERVICE_URL;
+
+const setup = async () => {
+ //setup wallet: TODO: Does this need to be a signer on the safe?
+ const provider = new ethers.providers.JsonRpcProvider(networkConfig.RPC_URL); //1
+ const signerWallet = new ethers.Wallet(networkConfig.PRIVATE_KEY, provider); //2
+ const ethAdapter = new EthersAdapter({
+ ethers,
+ signerOrProvider: signerWallet,
+ }); //3
+
+ // const safeService = new SafeApiKit({ txServiceUrl, ethAdapter: ethAdapter });
+
+ // const ethAdapter = await Safe.createDefaultEthAdapter();
+ const safeSdk = await Safe.default.create({
+ ethAdapter,
+ safeAddress,
+ });
+
+ const safeTransaction = await safeSdk.createEnableGuardTx(guardAddress);
+ const txResponse = await safeSdk.executeTransaction(safeTransaction);
+ await txResponse.transactionResponse?.wait();
+
+ const a = await safeSdk.getGuard();
+
+ console.log(a);
+};
+
+setup();
diff --git a/election-guard/setup/package.json b/election-guard/setup/package.json
new file mode 100644
index 00000000..cd282cf9
--- /dev/null
+++ b/election-guard/setup/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "setup",
+ "version": "1.0.0",
+ "main": "index.js",
+ "license": "MIT",
+ "type": "module",
+ "dependencies": {
+ "@safe-global/api-kit": "^1.1.0",
+ "@safe-global/protocol-kit": "^1.0.1",
+ "@safe-global/safe-core-sdk": "^3.3.4",
+ "dotenv": "^16.3.1",
+ "ethers": "5.7.2"
+ },
+ "scripts": {
+ "setup": "node index.js"
+ }
+}
diff --git a/election-guard/setup/yarn.lock b/election-guard/setup/yarn.lock
new file mode 100644
index 00000000..7eec98cf
--- /dev/null
+++ b/election-guard/setup/yarn.lock
@@ -0,0 +1,2787 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ethereumjs/common@2.5.0":
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268"
+ integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==
+ dependencies:
+ crc-32 "^1.2.0"
+ ethereumjs-util "^7.1.1"
+
+"@ethereumjs/common@^2.5.0":
+ version "2.6.5"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30"
+ integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==
+ dependencies:
+ crc-32 "^1.2.0"
+ ethereumjs-util "^7.1.5"
+
+"@ethereumjs/tx@3.3.2":
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00"
+ integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==
+ dependencies:
+ "@ethereumjs/common" "^2.5.0"
+ ethereumjs-util "^7.1.2"
+
+"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449"
+ integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef"
+ integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/networks" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/web" "^5.7.0"
+
+"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2"
+ integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+
+"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37"
+ integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+
+"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c"
+ integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+
+"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b"
+ integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+
+"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2"
+ integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ bn.js "^5.2.1"
+
+"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d"
+ integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e"
+ integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+
+"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e"
+ integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==
+ dependencies:
+ "@ethersproject/abi" "^5.7.0"
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+
+"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7"
+ integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf"
+ integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/basex" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/pbkdf2" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wordlists" "^5.7.0"
+
+"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360"
+ integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hdnode" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/pbkdf2" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ aes-js "3.0.0"
+ scrypt-js "3.0.1"
+
+"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a"
+ integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ js-sha3 "0.8.0"
+
+"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892"
+ integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==
+
+"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0":
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6"
+ integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102"
+ integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+
+"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30"
+ integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/providers@5.7.2":
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb"
+ integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/basex" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/networks" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/web" "^5.7.0"
+ bech32 "1.1.4"
+ ws "7.4.6"
+
+"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c"
+ integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304"
+ integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb"
+ integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3"
+ integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ bn.js "^5.2.1"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8"
+ integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2"
+ integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b"
+ integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+
+"@ethersproject/units@5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1"
+ integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/wallet@5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d"
+ integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/hdnode" "^5.7.0"
+ "@ethersproject/json-wallets" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wordlists" "^5.7.0"
+
+"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0":
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae"
+ integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==
+ dependencies:
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5"
+ integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@safe-global/api-kit@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@safe-global/api-kit/-/api-kit-1.1.0.tgz#b46bcb4491d43576832488183019769d37e3f3e6"
+ integrity sha512-3HB+Vl3dFunID4kadpAqYQQ9lfIJuCk9pYoJsfSWGeEgOOGFwexg3UtO8hh0JXoIO+bX8pm8x5GEF6pX8HeNTQ==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@safe-global/safe-core-sdk-types" "^2.0.0"
+ node-fetch "^2.6.6"
+
+"@safe-global/protocol-kit@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@safe-global/protocol-kit/-/protocol-kit-1.0.1.tgz#05c00436a75bebedb2cc35efc461c9aa909f8f89"
+ integrity sha512-ZLfFxV6U9f5bJKcCQmrDJq/FzDGz7FMpXOjJ+G90VkaqBme3En73sN1KGd7++VKS7H3ukyM/xetrJs2mtvHlZg==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/solidity" "^5.7.0"
+ "@safe-global/safe-deployments" "^1.22.0"
+ ethereumjs-util "^7.1.5"
+ semver "^7.3.8"
+ web3 "^1.8.1"
+ web3-core "^1.8.1"
+ web3-utils "^1.8.1"
+
+"@safe-global/safe-core-sdk-types@^1.9.2":
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk-types/-/safe-core-sdk-types-1.9.2.tgz#c8ae3500f5f16a9380f0270ab543f7f0718c9848"
+ integrity sha512-TVBoCf3bry3y6vmJXACDNOaQnHWTh8Q9G8P3wZCgUBxMc676hP9HEvF1Xrvwe0wMxevMIKyBnEV4FpZUJGSefg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/contracts" "^5.7.0"
+ "@safe-global/safe-deployments" "^1.25.0"
+ web3-core "^1.8.1"
+ web3-utils "^1.8.1"
+
+"@safe-global/safe-core-sdk-types@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk-types/-/safe-core-sdk-types-2.0.0.tgz#643dd87c9738ff8b3eaecb06ce399cae8a48af02"
+ integrity sha512-9bcGaEuJCRG1ccGxKNjLzJuXMqdJZEFkWi+1vf6UFO8gpmanasvBozMEo6fzUMtDBGgkkStYywhO6Cp0tKyD3Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/contracts" "^5.7.0"
+ "@safe-global/safe-deployments" "^1.22.0"
+ web3-core "^1.8.1"
+ web3-utils "^1.8.1"
+
+"@safe-global/safe-core-sdk-utils@^1.7.4":
+ version "1.7.4"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk-utils/-/safe-core-sdk-utils-1.7.4.tgz#810d36cf9629129a28eb1b9c6e690b163834b572"
+ integrity sha512-ITocwSWlFUA1K9VMP/eJiMfgbP/I9qDxAaFz7ukj5N5NZD3ihVQZkmqML6hjse5UhrfjCnfIEcLkNZhtB2XC2Q==
+ dependencies:
+ "@safe-global/safe-core-sdk-types" "^1.9.2"
+ semver "^7.3.8"
+ web3-utils "^1.8.1"
+
+"@safe-global/safe-core-sdk@^3.3.4":
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk/-/safe-core-sdk-3.3.4.tgz#d404287f9b910feab3e692243aaf62494ff2d2a9"
+ integrity sha512-tgcK7VWo66Z8632xaYDzUHQ8InPOaI10ELk1wCrO/C3QjPwxjIozbMGOMzF4RZPCSJX2YAHowAvOgmEukgSkxA==
+ dependencies:
+ "@ethersproject/solidity" "^5.7.0"
+ "@safe-global/safe-core-sdk-types" "^1.9.2"
+ "@safe-global/safe-core-sdk-utils" "^1.7.4"
+ "@safe-global/safe-deployments" "^1.25.0"
+ ethereumjs-util "^7.1.5"
+ semver "^7.3.8"
+ web3-utils "^1.8.1"
+
+"@safe-global/safe-deployments@^1.22.0", "@safe-global/safe-deployments@^1.25.0":
+ version "1.25.0"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-deployments/-/safe-deployments-1.25.0.tgz#882f0703cd4dd86cc19238319d77459ded09ec88"
+ integrity sha512-j7Ml1MVZw73XMTLbyIjo+Gvohwg5HYi8WM6b3vo+AkYEO/X4TNY8eJ0T0Awip5PO9MNyZymF3QY065uccQP53A==
+ dependencies:
+ semver "^7.3.7"
+
+"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0":
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f"
+ integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==
+
+"@szmarczak/http-timer@^4.0.5":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
+ integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==
+ dependencies:
+ defer-to-connect "^2.0.0"
+
+"@szmarczak/http-timer@^5.0.1":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a"
+ integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==
+ dependencies:
+ defer-to-connect "^2.0.1"
+
+"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682"
+ integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==
+ dependencies:
+ "@types/node" "*"
+
+"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2":
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183"
+ integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==
+ dependencies:
+ "@types/http-cache-semantics" "*"
+ "@types/keyv" "^3.1.4"
+ "@types/node" "*"
+ "@types/responselike" "^1.0.0"
+
+"@types/http-cache-semantics@*":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
+ integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==
+
+"@types/keyv@^3.1.4":
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6"
+ integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/node@*":
+ version "20.4.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d"
+ integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==
+
+"@types/node@^12.12.6":
+ version "12.20.55"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240"
+ integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1"
+ integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/responselike@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
+ integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c"
+ integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==
+ dependencies:
+ "@types/node" "*"
+
+abortcontroller-polyfill@^1.7.3:
+ version "1.7.5"
+ resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed"
+ integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==
+
+accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
+ integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
+asn1@~0.2.3:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
+ integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+available-typed-arrays@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
+ integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
+
+aws4@^1.8.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3"
+ integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==
+
+base-x@^3.0.2, base-x@^3.0.8:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320"
+ integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bech32@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
+ integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
+bignumber.js@^9.0.0:
+ version "9.1.1"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6"
+ integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==
+
+blakejs@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814"
+ integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==
+
+bluebird@^3.5.0:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@4.11.6:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+ integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==
+
+bn.js@^4.11.6, bn.js@^4.11.9:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
+ integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
+
+body-parser@1.20.1:
+ version "1.20.1"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668"
+ integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.11.0"
+ raw-body "2.5.1"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+body-parser@^1.16.0:
+ version "1.20.2"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
+ integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.5"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.11.0"
+ raw-body "2.5.2"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
+
+browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+bs58@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==
+ dependencies:
+ base-x "^3.0.2"
+
+bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+buffer-to-arraybuffer@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
+ integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==
+
+buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+bufferutil@^4.0.1:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad"
+ integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==
+ dependencies:
+ node-gyp-build "^4.3.0"
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+cacheable-lookup@^5.0.3:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
+ integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
+
+cacheable-lookup@^6.0.4:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385"
+ integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==
+
+cacheable-request@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817"
+ integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^4.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^6.0.1"
+ responselike "^2.0.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==
+
+chownr@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+cids@^0.7.1:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2"
+ integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==
+ dependencies:
+ buffer "^5.5.0"
+ class-is "^1.1.0"
+ multibase "~0.6.0"
+ multicodec "^1.0.0"
+ multihashes "~0.4.15"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-is@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825"
+ integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==
+
+clone-response@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3"
+ integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==
+ dependencies:
+ mimic-response "^1.0.0"
+
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-hash@^2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211"
+ integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==
+ dependencies:
+ cids "^0.7.1"
+ multicodec "^0.5.5"
+ multihashes "^0.4.15"
+
+content-type@~1.0.4, content-type@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+
+cookie@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
+ integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
+
+core-util-is@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
+
+cors@^2.8.1:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+crc-32@^1.2.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
+ integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-fetch@^3.1.4:
+ version "3.1.8"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82"
+ integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==
+ dependencies:
+ node-fetch "^2.6.12"
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.2.0:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+decode-uri-component@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
+ integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
+
+decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==
+ dependencies:
+ mimic-response "^1.0.0"
+
+decompress-response@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
+ integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
+ dependencies:
+ mimic-response "^3.1.0"
+
+defer-to-connect@^2.0.0, defer-to-connect@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
+ integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+dom-walk@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
+dotenv@^16.3.1:
+ version "16.3.1"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e"
+ integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.4:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50:
+ version "0.10.62"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
+ integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
+ dependencies:
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.3"
+ next-tick "^1.1.0"
+
+es6-iterator@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-promise@^4.2.8:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
+ integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+eth-ens-namehash@2.0.8:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf"
+ integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==
+ dependencies:
+ idna-uts46-hx "^2.3.1"
+ js-sha3 "^0.5.7"
+
+eth-lib@0.2.8:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8"
+ integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ xhr-request-promise "^0.1.2"
+
+eth-lib@^0.1.26:
+ version "0.1.29"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9"
+ integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ nano-json-stream-parser "^0.1.2"
+ servify "^0.1.12"
+ ws "^3.0.0"
+ xhr-request-promise "^0.1.2"
+
+ethereum-bloom-filters@^1.0.6:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a"
+ integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==
+ dependencies:
+ js-sha3 "^0.8.0"
+
+ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ browserify-aes "^1.2.0"
+ bs58check "^2.1.2"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ hash.js "^1.1.7"
+ keccak "^3.0.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.5:
+ version "7.1.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181"
+ integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ rlp "^2.2.4"
+
+ethers@5.7.2:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e"
+ integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==
+ dependencies:
+ "@ethersproject/abi" "5.7.0"
+ "@ethersproject/abstract-provider" "5.7.0"
+ "@ethersproject/abstract-signer" "5.7.0"
+ "@ethersproject/address" "5.7.0"
+ "@ethersproject/base64" "5.7.0"
+ "@ethersproject/basex" "5.7.0"
+ "@ethersproject/bignumber" "5.7.0"
+ "@ethersproject/bytes" "5.7.0"
+ "@ethersproject/constants" "5.7.0"
+ "@ethersproject/contracts" "5.7.0"
+ "@ethersproject/hash" "5.7.0"
+ "@ethersproject/hdnode" "5.7.0"
+ "@ethersproject/json-wallets" "5.7.0"
+ "@ethersproject/keccak256" "5.7.0"
+ "@ethersproject/logger" "5.7.0"
+ "@ethersproject/networks" "5.7.1"
+ "@ethersproject/pbkdf2" "5.7.0"
+ "@ethersproject/properties" "5.7.0"
+ "@ethersproject/providers" "5.7.2"
+ "@ethersproject/random" "5.7.0"
+ "@ethersproject/rlp" "5.7.0"
+ "@ethersproject/sha2" "5.7.0"
+ "@ethersproject/signing-key" "5.7.0"
+ "@ethersproject/solidity" "5.7.0"
+ "@ethersproject/strings" "5.7.0"
+ "@ethersproject/transactions" "5.7.0"
+ "@ethersproject/units" "5.7.0"
+ "@ethersproject/wallet" "5.7.0"
+ "@ethersproject/web" "5.7.1"
+ "@ethersproject/wordlists" "5.7.0"
+
+ethjs-unit@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
+ integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==
+ dependencies:
+ bn.js "4.11.6"
+ number-to-bn "1.7.0"
+
+eventemitter3@4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
+ integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
+
+evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+express@^4.14.0:
+ version "4.18.2"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
+ integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.1"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.5.0"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.2.0"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.7"
+ qs "6.11.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.18.0"
+ serve-static "1.15.0"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+ext@^1.1.2:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
+ integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
+ dependencies:
+ type "^2.7.2"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==
+
+extsprintf@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
+ integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+finalhandler@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
+ integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ statuses "2.0.1"
+ unpipe "~1.0.0"
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
+
+form-data-encoder@1.7.1:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96"
+ integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
+fs-extra@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+ integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-minipass@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.0"
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.3:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82"
+ integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+
+get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==
+ dependencies:
+ assert-plus "^1.0.0"
+
+global@~4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+ dependencies:
+ min-document "^2.19.0"
+ process "^0.11.10"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+got@12.1.0:
+ version "12.1.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4"
+ integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==
+ dependencies:
+ "@sindresorhus/is" "^4.6.0"
+ "@szmarczak/http-timer" "^5.0.1"
+ "@types/cacheable-request" "^6.0.2"
+ "@types/responselike" "^1.0.0"
+ cacheable-lookup "^6.0.4"
+ cacheable-request "^7.0.2"
+ decompress-response "^6.0.0"
+ form-data-encoder "1.7.1"
+ get-stream "^6.0.1"
+ http2-wrapper "^2.1.10"
+ lowercase-keys "^3.0.0"
+ p-cancelable "^3.0.0"
+ responselike "^2.0.0"
+
+got@^11.8.5:
+ version "11.8.6"
+ resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a"
+ integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==
+ dependencies:
+ "@sindresorhus/is" "^4.0.0"
+ "@szmarczak/http-timer" "^4.0.5"
+ "@types/cacheable-request" "^6.0.1"
+ "@types/responselike" "^1.0.0"
+ cacheable-lookup "^5.0.3"
+ cacheable-request "^7.0.2"
+ decompress-response "^6.0.0"
+ http2-wrapper "^1.0.0-beta.5.2"
+ lowercase-keys "^2.0.0"
+ p-cancelable "^2.0.0"
+ responselike "^2.0.0"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+http-cache-semantics@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
+ integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+http-https@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b"
+ integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+http2-wrapper@^1.0.0-beta.5.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
+ integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
+ dependencies:
+ quick-lru "^5.1.1"
+ resolve-alpn "^1.0.0"
+
+http2-wrapper@^2.1.10:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3"
+ integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==
+ dependencies:
+ quick-lru "^5.1.1"
+ resolve-alpn "^1.2.0"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+idna-uts46-hx@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9"
+ integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==
+ dependencies:
+ punycode "2.1.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-arguments@^1.0.4:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
+ integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-callable@^1.1.3:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-function@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+ integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
+is-generator-function@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
+ integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==
+
+is-typed-array@^1.1.10, is-typed-array@^1.1.3:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f"
+ integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==
+
+js-sha3@0.8.0, js-sha3@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+js-sha3@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
+ integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
+ integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsprim@^1.2.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
+ integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.4.0"
+ verror "1.10.0"
+
+keccak@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276"
+ integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+ readable-stream "^3.6.0"
+
+keyv@^4.0.0:
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56"
+ integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==
+ dependencies:
+ json-buffer "3.0.1"
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lowercase-keys@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2"
+ integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-response@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+mimic-response@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
+ integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
+
+minimist@^1.2.6:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+minipass@^2.6.0, minipass@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
+ integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
+ integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+ dependencies:
+ minipass "^2.9.0"
+
+mkdirp-promise@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
+ integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==
+ dependencies:
+ mkdirp "*"
+
+mkdirp@*:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50"
+ integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==
+
+mkdirp@^0.5.5:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
+ integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+ dependencies:
+ minimist "^1.2.6"
+
+mock-fs@^4.1.0:
+ version "4.14.0"
+ resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18"
+ integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multibase@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b"
+ integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multibase@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b"
+ integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multicodec@^0.5.5:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd"
+ integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==
+ dependencies:
+ varint "^5.0.0"
+
+multicodec@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f"
+ integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==
+ dependencies:
+ buffer "^5.6.0"
+ varint "^5.0.0"
+
+multihashes@^0.4.15, multihashes@~0.4.15:
+ version "0.4.21"
+ resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5"
+ integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==
+ dependencies:
+ buffer "^5.5.0"
+ multibase "^0.7.0"
+ varint "^5.0.0"
+
+nano-json-stream-parser@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
+ integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==
+
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+next-tick@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+ integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-fetch@^2.6.12, node-fetch@^2.6.6:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba"
+ integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-gyp-build@^4.2.0, node-gyp-build@^4.3.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055"
+ integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==
+
+normalize-url@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
+ integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
+
+number-to-bn@1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
+ integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==
+ dependencies:
+ bn.js "4.11.6"
+ strip-hex-prefix "1.0.0"
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.9.0:
+ version "1.12.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
+ integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
+
+oboe@2.1.5:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd"
+ integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==
+ dependencies:
+ http-https "^1.0.0"
+
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+p-cancelable@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
+ integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
+
+p-cancelable@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050"
+ integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==
+
+parse-headers@^2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9"
+ integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
+
+pbkdf2@^3.0.17:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
+
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+psl@^1.1.28:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+ integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
+ integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
+
+qs@6.11.0:
+ version "6.11.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
+ integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
+ dependencies:
+ side-channel "^1.0.4"
+
+qs@~6.5.2:
+ version "6.5.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
+ integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+quick-lru@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
+ integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
+ integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+raw-body@2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+readable-stream@^3.6.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+request@^2.79.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+resolve-alpn@^1.0.0, resolve-alpn@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
+ integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==
+
+responselike@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc"
+ integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==
+ dependencies:
+ lowercase-keys "^2.0.0"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.2.4:
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf"
+ integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==
+ dependencies:
+ bn.js "^5.2.0"
+
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+secp256k1@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303"
+ integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==
+ dependencies:
+ elliptic "^6.5.4"
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+semver@^7.3.7, semver@^7.3.8:
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
+ integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+ dependencies:
+ lru-cache "^6.0.0"
+
+send@0.18.0:
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
+ integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "2.4.1"
+ range-parser "~1.2.1"
+ statuses "2.0.1"
+
+serve-static@1.15.0:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
+ integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.18.0"
+
+servify@^0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95"
+ integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==
+ dependencies:
+ body-parser "^1.16.0"
+ cors "^2.8.1"
+ express "^4.14.0"
+ request "^2.79.0"
+ xhr "^2.3.3"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^2.7.0:
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019"
+ integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==
+ dependencies:
+ decompress-response "^3.3.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+sshpk@^1.7.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5"
+ integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+swarm-js@^0.1.40:
+ version "0.1.42"
+ resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979"
+ integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==
+ dependencies:
+ bluebird "^3.5.0"
+ buffer "^5.0.5"
+ eth-lib "^0.1.26"
+ fs-extra "^4.0.2"
+ got "^11.8.5"
+ mime-types "^2.1.16"
+ mkdirp-promise "^5.0.1"
+ mock-fs "^4.1.0"
+ setimmediate "^1.0.5"
+ tar "^4.0.2"
+ xhr-request "^1.0.1"
+
+tar@^4.0.2:
+ version "4.4.19"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3"
+ integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==
+ dependencies:
+ chownr "^1.1.4"
+ fs-minipass "^1.2.7"
+ minipass "^2.9.0"
+ minizlib "^1.3.3"
+ mkdirp "^0.5.5"
+ safe-buffer "^5.2.1"
+ yallist "^3.1.1"
+
+timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==
+
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.7.2:
+ version "2.7.2"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
+ integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+ integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+url-set-query@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
+ integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==
+
+utf-8-validate@^5.0.2:
+ version "5.0.10"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2"
+ integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==
+ dependencies:
+ node-gyp-build "^4.3.0"
+
+utf8@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
+ integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
+
+util-deprecate@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+util@^0.12.5:
+ version "0.12.5"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc"
+ integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==
+ dependencies:
+ inherits "^2.0.3"
+ is-arguments "^1.0.4"
+ is-generator-function "^1.0.7"
+ is-typed-array "^1.1.3"
+ which-typed-array "^1.1.2"
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+uuid@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
+ integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
+
+varint@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4"
+ integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+web3-bzz@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.0.tgz#ac74bc71cdf294c7080a79091079192f05c5baed"
+ integrity sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==
+ dependencies:
+ "@types/node" "^12.12.6"
+ got "12.1.0"
+ swarm-js "^0.1.40"
+
+web3-core-helpers@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz#1016534c51a5df77ed4f94d1fcce31de4af37fad"
+ integrity sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==
+ dependencies:
+ web3-eth-iban "1.10.0"
+ web3-utils "1.10.0"
+
+web3-core-method@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.0.tgz#82668197fa086e8cc8066742e35a9d72535e3412"
+ integrity sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==
+ dependencies:
+ "@ethersproject/transactions" "^5.6.2"
+ web3-core-helpers "1.10.0"
+ web3-core-promievent "1.10.0"
+ web3-core-subscriptions "1.10.0"
+ web3-utils "1.10.0"
+
+web3-core-promievent@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz#cbb5b3a76b888df45ed3a8d4d8d4f54ccb66a37b"
+ integrity sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==
+ dependencies:
+ eventemitter3 "4.0.4"
+
+web3-core-requestmanager@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz#4b34f6e05837e67c70ff6f6993652afc0d54c340"
+ integrity sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==
+ dependencies:
+ util "^0.12.5"
+ web3-core-helpers "1.10.0"
+ web3-providers-http "1.10.0"
+ web3-providers-ipc "1.10.0"
+ web3-providers-ws "1.10.0"
+
+web3-core-subscriptions@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz#b534592ee1611788fc0cb0b95963b9b9b6eacb7c"
+ integrity sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==
+ dependencies:
+ eventemitter3 "4.0.4"
+ web3-core-helpers "1.10.0"
+
+web3-core@1.10.0, web3-core@^1.8.1:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.0.tgz#9aa07c5deb478cf356c5d3b5b35afafa5fa8e633"
+ integrity sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==
+ dependencies:
+ "@types/bn.js" "^5.1.1"
+ "@types/node" "^12.12.6"
+ bignumber.js "^9.0.0"
+ web3-core-helpers "1.10.0"
+ web3-core-method "1.10.0"
+ web3-core-requestmanager "1.10.0"
+ web3-utils "1.10.0"
+
+web3-eth-abi@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz#53a7a2c95a571e205e27fd9e664df4919483cce1"
+ integrity sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==
+ dependencies:
+ "@ethersproject/abi" "^5.6.3"
+ web3-utils "1.10.0"
+
+web3-eth-accounts@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz#2942beca0a4291455f32cf09de10457a19a48117"
+ integrity sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==
+ dependencies:
+ "@ethereumjs/common" "2.5.0"
+ "@ethereumjs/tx" "3.3.2"
+ eth-lib "0.2.8"
+ ethereumjs-util "^7.1.5"
+ scrypt-js "^3.0.1"
+ uuid "^9.0.0"
+ web3-core "1.10.0"
+ web3-core-helpers "1.10.0"
+ web3-core-method "1.10.0"
+ web3-utils "1.10.0"
+
+web3-eth-contract@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz#8e68c7654576773ec3c91903f08e49d0242c503a"
+ integrity sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==
+ dependencies:
+ "@types/bn.js" "^5.1.1"
+ web3-core "1.10.0"
+ web3-core-helpers "1.10.0"
+ web3-core-method "1.10.0"
+ web3-core-promievent "1.10.0"
+ web3-core-subscriptions "1.10.0"
+ web3-eth-abi "1.10.0"
+ web3-utils "1.10.0"
+
+web3-eth-ens@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz#96a676524e0b580c87913f557a13ed810cf91cd9"
+ integrity sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==
+ dependencies:
+ content-hash "^2.5.2"
+ eth-ens-namehash "2.0.8"
+ web3-core "1.10.0"
+ web3-core-helpers "1.10.0"
+ web3-core-promievent "1.10.0"
+ web3-eth-abi "1.10.0"
+ web3-eth-contract "1.10.0"
+ web3-utils "1.10.0"
+
+web3-eth-iban@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz#5a46646401965b0f09a4f58e7248c8a8cd22538a"
+ integrity sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==
+ dependencies:
+ bn.js "^5.2.1"
+ web3-utils "1.10.0"
+
+web3-eth-personal@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz#94d525f7a29050a0c2a12032df150ac5ea633071"
+ integrity sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==
+ dependencies:
+ "@types/node" "^12.12.6"
+ web3-core "1.10.0"
+ web3-core-helpers "1.10.0"
+ web3-core-method "1.10.0"
+ web3-net "1.10.0"
+ web3-utils "1.10.0"
+
+web3-eth@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.10.0.tgz#38b905e2759697c9624ab080cfcf4e6c60b3a6cf"
+ integrity sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==
+ dependencies:
+ web3-core "1.10.0"
+ web3-core-helpers "1.10.0"
+ web3-core-method "1.10.0"
+ web3-core-subscriptions "1.10.0"
+ web3-eth-abi "1.10.0"
+ web3-eth-accounts "1.10.0"
+ web3-eth-contract "1.10.0"
+ web3-eth-ens "1.10.0"
+ web3-eth-iban "1.10.0"
+ web3-eth-personal "1.10.0"
+ web3-net "1.10.0"
+ web3-utils "1.10.0"
+
+web3-net@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.10.0.tgz#be53e7f5dafd55e7c9013d49c505448b92c9c97b"
+ integrity sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==
+ dependencies:
+ web3-core "1.10.0"
+ web3-core-method "1.10.0"
+ web3-utils "1.10.0"
+
+web3-providers-http@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.0.tgz#864fa48675e7918c9a4374e5f664b32c09d0151b"
+ integrity sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==
+ dependencies:
+ abortcontroller-polyfill "^1.7.3"
+ cross-fetch "^3.1.4"
+ es6-promise "^4.2.8"
+ web3-core-helpers "1.10.0"
+
+web3-providers-ipc@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz#9747c7a6aee96a51488e32fa7c636c3460b39889"
+ integrity sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==
+ dependencies:
+ oboe "2.1.5"
+ web3-core-helpers "1.10.0"
+
+web3-providers-ws@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz#cb0b87b94c4df965cdf486af3a8cd26daf3975e5"
+ integrity sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==
+ dependencies:
+ eventemitter3 "4.0.4"
+ web3-core-helpers "1.10.0"
+ websocket "^1.0.32"
+
+web3-shh@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.10.0.tgz#c2979b87e0f67a7fef2ce9ee853bd7bfbe9b79a8"
+ integrity sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==
+ dependencies:
+ web3-core "1.10.0"
+ web3-core-method "1.10.0"
+ web3-core-subscriptions "1.10.0"
+ web3-net "1.10.0"
+
+web3-utils@1.10.0, web3-utils@^1.8.1:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578"
+ integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==
+ dependencies:
+ bn.js "^5.2.1"
+ ethereum-bloom-filters "^1.0.6"
+ ethereumjs-util "^7.1.0"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ utf8 "3.0.0"
+
+web3@^1.8.1:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-1.10.0.tgz#2fde0009f59aa756c93e07ea2a7f3ab971091274"
+ integrity sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==
+ dependencies:
+ web3-bzz "1.10.0"
+ web3-core "1.10.0"
+ web3-eth "1.10.0"
+ web3-eth-personal "1.10.0"
+ web3-net "1.10.0"
+ web3-shh "1.10.0"
+ web3-utils "1.10.0"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
+websocket@^1.0.32:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
+ integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which-typed-array@^1.1.2:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6"
+ integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+ is-typed-array "^1.1.10"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+ws@7.4.6:
+ version "7.4.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+ws@^3.0.0:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+ integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+ ultron "~1.1.0"
+
+xhr-request-promise@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"
+ integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==
+ dependencies:
+ xhr-request "^1.1.0"
+
+xhr-request@^1.0.1, xhr-request@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed"
+ integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==
+ dependencies:
+ buffer-to-arraybuffer "^0.0.5"
+ object-assign "^4.1.1"
+ query-string "^5.0.1"
+ simple-get "^2.7.0"
+ timed-out "^4.0.1"
+ url-set-query "^1.0.0"
+ xhr "^2.0.4"
+
+xhr@^2.0.4, xhr@^2.3.3:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
+ integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
+ dependencies:
+ global "~4.4.0"
+ is-function "^1.0.1"
+ parse-headers "^2.0.0"
+ xtend "^4.0.0"
+
+xtend@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+yaeti@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+ integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==
+
+yallist@^3.0.0, yallist@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
diff --git a/election-guard/src/ElectionGuard.sol b/election-guard/src/ElectionGuard.sol
new file mode 100644
index 00000000..978a0fc4
--- /dev/null
+++ b/election-guard/src/ElectionGuard.sol
@@ -0,0 +1,102 @@
+// SPDX-License-Identifier: LGPL-3.0-only
+pragma solidity >=0.7.0 <0.9.0;
+
+// import "../../common/Enum.sol";
+// import "../../base/GuardManager.sol";
+// import "../../Safe.sol";
+import "safe-contracts/contracts/common/Enum.sol";
+import "safe-contracts/contracts/base/GuardManager.sol";
+import "safe-contracts/contracts/Safe.sol";
+
+import {ZkBallot} from "./ZkBallot.sol";
+
+/**
+ * @title Debug Transaction Guard - Emits transaction events with extended information.
+ * @dev This guard is only meant as a development tool and example
+ * @author Richard Meissner - @rmeissner
+ */
+contract DebugTransactionGuard is BaseGuard {
+ // solhint-disable-next-line payable-fallback
+ fallback() external {
+ // We don't revert on fallback to avoid issues in case of a Safe upgrade
+ // E.g. The expected check method might change and then the Safe would be locked.
+ }
+
+ event TransactionDetails(
+ address indexed safe,
+ bytes32 indexed txHash,
+ address to,
+ uint256 value,
+ bytes data,
+ Enum.Operation operation,
+ uint256 safeTxGas,
+ bool usesRefund,
+ uint256 nonce,
+ bytes signatures,
+ address executor
+ );
+
+ event GasUsage(address indexed safe, bytes32 indexed txHash, uint256 indexed nonce, bool success);
+
+ mapping(bytes32 => uint256) public txNonces;
+
+ /**
+ * @notice Called by the Safe contract before a transaction is executed.
+ * @param to Destination address of Safe transaction.
+ * @param value Ether value of Safe transaction.
+ * @param data Data payload of Safe transaction.
+ * @param operation Operation type of Safe transaction.
+ * @param safeTxGas Gas that should be used for the Safe transaction.
+ * @param baseGas Gas costs that are independent of the transaction execution (e.g. base transaction fee, signature check, payment of the refund)
+ * @param gasPrice Gas price that should be used for the payment calculation.
+ * @param gasToken Token address (or 0 if ETH) that is used for the payment.
+ * @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).
+ * @param signatures Signature data that should be verified. Can be packed ECDSA signature ({bytes32 r}{bytes32 s}{uint8 v}), contract signature (EIP-1271) or approved hash.
+ * @param executor Account executing the transaction.
+ */
+ function checkTransaction(
+ address to,
+ uint256 value,
+ bytes memory data,
+ Enum.Operation operation,
+ uint256 safeTxGas,
+ uint256 baseGas,
+ uint256 gasPrice,
+ address gasToken,
+ // solhint-disable-next-line no-unused-vars
+ address payable refundReceiver,
+ bytes memory signatures,
+ address executor
+ ) external override {
+ uint256 nonce;
+ bytes32 txHash;
+ {
+ Safe safe = Safe(payable(msg.sender));
+ nonce = safe.nonce() - 1;
+ txHash = safe.getTransactionHash(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, nonce);
+ }
+ emit TransactionDetails(msg.sender, txHash, to, value, data, operation, safeTxGas, gasPrice > 0, nonce, signatures, executor);
+ txNonces[txHash] = nonce;
+
+ // 1. set vote contract address
+ // 2. Pull vote id from the dataField -- do we need to do any parsing here?
+ // 3. revert if false
+
+ ZkBallot zkb = ZkBallot(0xEce86f082E7f11525886D4c9B6B04b5875DE381e);
+ bool success = zkb.checkElectionSuccess(txHash);
+ require(success, "Election not yet successful.");
+
+ }
+
+ /**
+ * @notice Called by the Safe contract after a transaction is executed.
+ * @param txHash Hash of the executed transaction.
+ * @param success True if the transaction was successful.
+ */
+ function checkAfterExecution(bytes32 txHash, bool success) external override {
+ uint256 nonce = txNonces[txHash];
+ require(nonce != 0, "Could not get nonce");
+ txNonces[txHash] = 0;
+ emit GasUsage(msg.sender, txHash, nonce, success);
+ }
+}
\ No newline at end of file
diff --git a/election-guard/src/ZkBallot.sol b/election-guard/src/ZkBallot.sol
new file mode 100644
index 00000000..8edd30a2
--- /dev/null
+++ b/election-guard/src/ZkBallot.sol
@@ -0,0 +1,112 @@
+// Proposal:
+// name
+// id
+// voteCount
+// voteDirection
+// nullifiers
+
+
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.7.0 <0.9.0;
+
+
+interface IUltraVerifier {
+ function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool);
+}
+
+/**
+ * @title ZkBallot
+ * @dev Implements voting process along with vote delegation
+ */
+contract ZkBallot {
+
+
+ struct Election {
+ // If you can limit the length to a certain number of bytes,
+ // always use one of bytes1 to bytes32 because they are much cheaper
+ string name; // short name (up to 32 bytes)
+ // uint32 id; // unique identifier
+ uint voteCount; // number of accumulated votes
+ int voteBalance; // cumulative sum of votes, where yes is 1, no is -1.
+ // bytes32[] nullifiers;
+ uint32 quorum; // number of votes needed to pass
+ bytes32 merkleRoot; //merkle root of tree containing all voters
+ }
+
+// Election[] public elections; //election.id is the index of the proposal in this array
+
+ mapping(bytes32 => Election) public elections; // id -> election TODO: Drop for txHash only but requires prover changes.
+ mapping(bytes32 => bool) nullifiers;
+ mapping(bytes32 => bytes32) public txHashToElectionId;
+
+ function vote(bytes calldata _proof, bytes32[] calldata _publicInputs) public {
+
+ // require(elections.length > 0, "No proposals exist."); // for array version
+ // require(elections.length > _electionId, "This proposal does not exist."); // for array version
+
+ bool validProof = verifyProof(_proof, _publicInputs);
+ require(validProof, "This proof is not valid.");
+
+ Election storage election = elections[_publicInputs[1]];
+
+ // check if nullifier has been used, add to mapping if not.
+ // TODO: convert proof bytes to structured data
+ require(!nullifiers[_publicInputs[3]], "This proof has already been used.");
+ nullifiers[_publicInputs[3]] = true;
+
+ uint(_publicInputs[2]) > 0 ? election.voteBalance++ : election.voteBalance--;
+ election.voteCount++;
+ }
+
+ function verifyProof(bytes calldata _proof, bytes32[] calldata _publicInputs) public view returns (bool){
+ // If item passed is parsed, need to change _proof to memory, not calldata
+ //goerli
+ // bool result = IUltraVerifier(0x3172a66630BE2BE7d02f38d53dc038A090B82eA7).verify(_proof, _publicInputs);
+ //gnosis
+ bool result = IUltraVerifier(0xE249C59F4c5A0Dd8b0Fe1610e25b4ECA3A2fc74a).verify(_proof, _publicInputs);
+
+ return result;
+ }
+
+ function checkElectionSuccess(bytes32 _txHash) public view returns (bool){
+
+ bool result = true;
+ //// Check vote hit quorum and if election.voteBalance > 0
+ // require(elections[_electionId].voteCount >= 1, "At least 1 vote required.");
+ // require(elections[_electionId].voteCount >= elections[_electionId].quorum, "Quorum not met.");
+ // require(elections[_electionId].voteBalance > 0, "Vote balance not positive.");
+
+ bytes32 electionId = txHashToElectionId[_txHash];
+
+ result = result && elections[electionId].voteCount >= 1;
+ result = result && elections[electionId].voteCount >= elections[electionId].quorum;
+ result = result && elections[electionId].voteBalance > 0;
+
+ return result;
+ }
+
+ function electionExists(bytes32 _txHash) public view returns (bool){
+ return txHashToElectionId[_txHash] != 0;
+ }
+
+ // returns voteCount, voteBalance and quorum for a given election
+ function getVoteInfo(bytes32 _txHash) public view returns (uint, int, uint32){
+ bytes32 electionId = txHashToElectionId[_txHash];
+ return (elections[electionId].voteCount, elections[electionId].voteBalance, elections[electionId].quorum);
+ }
+
+ function createElection(string calldata _name, uint32 _quorum, bytes32 _id, bytes32 _txHash, bytes32 _merkleRoot) public {
+ // create the elction and return id as a uint32
+ //mapping(bytes32 => bool) storage emptyNullifiers;
+ Election memory newElection = Election(_name, 0, 0, _quorum, _merkleRoot);
+
+ // elections.push(newElection); //array
+ // elections[_txHash] = newElection; //mapping
+
+ txHashToElectionId[_txHash] = _id;
+ elections[_id] = newElection; //testing
+
+ return;
+ }
+}
\ No newline at end of file
diff --git a/election-guard/test/ElectionGuard.t.sol b/election-guard/test/ElectionGuard.t.sol
new file mode 100644
index 00000000..81478ced
--- /dev/null
+++ b/election-guard/test/ElectionGuard.t.sol
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+import "forge-std/Test.sol";
+import "../src/ElectionGuard.sol";
+
+// contract CounterTest is Test {
+// Counter public counter;
+
+// function setUp() public {
+// counter = new Counter();
+// counter.setNumber(0);
+// }
+
+// function testIncrement() public {
+// counter.increment();
+// assertEq(counter.number(), 1);
+// }
+
+// function testSetNumber(uint256 x) public {
+// counter.setNumber(x);
+// assertEq(counter.number(), x);
+// }
+// }
diff --git a/election-guard/test/ZkBallot.t.sol b/election-guard/test/ZkBallot.t.sol
new file mode 100644
index 00000000..6369baae
--- /dev/null
+++ b/election-guard/test/ZkBallot.t.sol
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+import "forge-std/Test.sol";
+import { ZkBallot } from "../src/ZkBallot.sol";
+
+// Merkle root
+// Proposal Id: 0
+// Vote: 1
+// Nullifier
+
+bytes constant proof = hex"22b183de2b67df17a1eb50a081501b3d5791f6092a1edeebfee4afcd25f94c9a24fcde37cae02e895ed49e8fa633b6b72ff57f69cbc40f4ac9b2a1009c7908532a2a1ac38eb7e73ef086f380ca6248e43286e4c0fa52149bceb19dc6a35f28aa125d6f55928672c92b4a11bb81b7a0fa1748446169a99c139ef8605db7babfcf01fa45f9a68a4e4ac42b1bc20a5d9744b3f8e320f08398778e0c00f81a0d75c010ddb48189364ab66c617a1d01b7d33c2f41d589b5e6e3a4cfe7c9096782909e3044c3ad32cb6afb6ca3b875cedbc32e8c8ed9bff10dbbef9b61feda09c235f017cfbcc6baa887293747fb2f314d413302cd817d29dd11ca2eb3c290248ba9572d3c49b50bfdb3dd772e83a8cd3181c6bfeaad2011e64e6b936cec9ec43825d411244cb800fabd23b4a0942a2fb6765e5ee7490e54ad6a6770143112992879d012591086ee707889ca62674c2f8e04903619f5ff57997d801c4466c43c6e95db21fa7a12ae2efdab3bea06bca1e832aa595791cdf3324cdd631a5dacfad3737d2d67d4d0af1752bfc5094f0fca3e1d5bc9bbc432734308988112f7a1805aef411e154176771fe5fbe6fb99587dc01a3a777d94c454a76fd5ca8dba27110fae4527dc27cd3b75f2c5ad7892742a41dafb289a9e158f2e3afaeba3bbadf3ef71fa2636ee4d27b445d0407e345008624c5e577f0742bbdd0c9027ab5df9fbe028ef194818393887c7257154d51de37c5d0e02bfab2d5c9503dd2067e6417e7bf6f621c2b66d7f25dd45a5e4219eec38dac194ec8466b25c4e532b972f2c0cc918bc0a7c5049c7cf242736950ecfc41ddf641c2daba0e0a6154ab5f7c877c73f863a221c3bb6eab84410b5857e956756b1d2a2d870299e9116bd2a919f39c102669e2872f9ed01298656e18bf87d70202105364a2ffd784c03dc4d27de0c9e3df5241b9ccb4aea39c9003065cf728ae45cc191d3eabc17f147fdbeabf4422676a2a50e89b4eda972cbb7579eb8769a8165f1787fdd36be98c0eef857245a80dca8cc28ec6ed53407b69e5ad4f4d5423e189d79ad2646dbfba283b84587e42bd7cc27038f190975777becb12a98a80c765d2ad444cb840b7a522bde0a65c9cf0a28bb095794b65d32cf0a8f8af1bedc58b0d7fdb38c588d5b65b960ed57e9117996441dd9e8f3c3a6aa3146980c89654c927b242106800618e554eab377f5532f018908d7849f361d8a92018e44b5fd347d0f6dc7e87370ea5bff510d421a282b5d920595c7d7c3fe67f4ba682dcfcbf12832cbcf202c4d3deaeea0bec23ed8cd6bb31f3f2d1a2acdd94dded52a10e98b5d2606b46816702aaca2cfb5aeb20912820b257167d6008d62de4b0f6b392c837b2e8d8071bf5b444d89ae1284e63701617123482ad5b42f6421497906f3698a41ba21ba3c4d13cb93e7b076a8946734edc504459d96f399f6057d5dbf9c052176660e046eaaee08820e0d93d60b6ea8869619b624af62c1a44300c98c7ba43f87f7efa9aa5974e6976ccd87bcf86eba897d17092194434873d5f8416d679ada8988209e0a8d4b01ea6b42c7c6b0e1dae4f202a598764c883da7a08b8be34fc0b68f3e8a71b31727164164616cd1f2f1b68102b81fd7091e136d6066924a53a73ca281a2235f6a85c97264b0bdb1b0c0325d092af62675dc7727fab5c717f813ef1c0f6e3143688156b359ad4a036a5560e0188d0110ecf590076c76db60d06e16fda3ad349c6055346e7b46d0d90089a98d112e01d2b900e2e96dbcb78f11498fcab3319e6cbb274f5ca4b40760a35b08f01667d1b6d078244509ac52ab52588d642bbad7f0d4cf77ee875b41efde5e63460519b3c631093a2c5e4bbb603661bfcf37f4649e120fbae9c689c3f949d8ef0423964e8e9cfc4c4f91bc1b1ecdf5bb9684e74157028ccc34e811909cc055700d2eff7fec371075471c3a105aa2059ba06f80c0700204ad53985cdb1dbcc5e3dd03613a6701ccd3f846e61947762417f0f37c32987d37d35672c68efa290c162e25f7341ddbd553c3cc22d93d3d7915208266ace963f20cd6ba036ffa4800a56804b550628953648e34ce9014e1483791042c02db255f3ae7257f137176c12f142d07818a5693f6b77fbd1de2163fcc2a6426b9cf939e75209d6b4ccd907fbbc1158445dad62229ccd25650c5e667a171c5bf8eea8d978d1e18482583582bb7fd041762ccf63b68385a22c9c436bafd4303427c3474d5a6fbfb2255a6f6f64324196aaf772eb798e04d619b04394fa24aa498b7727b19ecb177e2bda017f63e911088406f76546134baf0afaa6cebf8f48fa51f5a3ba52879c4918d283e42df7a20d657c1817880aeb4e6b865f17405c0dbda88f1395c4702494fd7493e2356ac2bd8ae3f546df7df32a39b80fdd788f77214bf6a9cc247039c25bb62a3d7fc4529cf9e299014cbc51272c64bc57dd105da9e59175da4010fd740ce26ad923a80252538e0b1600f9cacd5a064ec76a75d786b18979abf0aac6d2f41409217cb5b18545164238bf95ad5b9e4dc8dd873eda8ed9c8249a4cfe683994c2cf2e52fae2e9c9043160e2fb95d3ba50c241eae66bcd2087be93ebdb8bff07eaca952887814c4941e6526c93aedd6f448a42aaef54db7d28868e61733f2d89443696071402122081d22e99ae3987a29b82ba82449c4c1f0008ac7aae329eccb08c8efc3f7237a520abce26dd08d0cb616a965cef6b8c2d4d0bec2812ae79f22ca0f6ad2371df00703dfc4b2fa6c18703118956200d582a39c08a4403233d02ffebba68d4213367466936a814a1f9719a4bc6f5a362b14f770ffb2102d8f7c31cb69e4612109d97a432d48f7eb8c3553638c221216d71aafc13cc90ef0a6bf1dc102c446f92cda88a611f26ad05162c7f53932e7a0d6719ef17ce5539b30116d4314f9a1020f4a492f245e4b492308a6c699eae8c08d2b4f24d7e974d5018372279a75ce310286e2947bab5d8bf57ed75939d92236ec5ac53bce82a3de1daea04458d49fae";
+
+contract ZkBallotTest is Test {
+ ZkBallot public zkb;
+ bytes32[] pubInputsBad = [bytes32(0x0e57fb44adb59385feb5e6d0c72ad05f7e51b44eedb6261d116c64a59d87033d), bytes32(0x0000000000000000000000000000000000000000000000000000000000000000), bytes32(0x0000000000000000000000000000000000000000000000000000000000000001), bytes32(0x22d5fd1e78a9e60115b8252b120f9b0743c56d1508c05666c87ce0fc6f16dd52)];
+ bytes32[] pubInputsGood = [bytes32(0x0e47fc44adb59385feb5e6d0c72ad05f7e51b44eedb6261d116c64a59d87033d), bytes32(0x0000000000000000000000000000000000000000000000000000000000000000), bytes32(0x0000000000000000000000000000000000000000000000000000000000000001), bytes32(0x22d5fd1e78a9e60115b8252b120f9b0743c56d1508c05666c87ce0fc6f16dd52)];
+
+ function setUp() public {
+ zkb = new ZkBallot();
+ zkb.createElection('First Election', 1, 0, pubInputsGood[0], "0x0000000");
+ }
+
+ function testProofGood() public {
+ bool test = zkb.verifyProof(proof, pubInputsGood);
+ assertTrue(test);
+ }
+
+ function testProofBad() public {
+ bool test = zkb.verifyProof(proof, pubInputsBad);
+ assertTrue(test);
+ }
+
+}
diff --git a/ethbarcelona/.gitignore b/ethbarcelona/.gitignore
index 45c1abce..4ccb8973 100644
--- a/ethbarcelona/.gitignore
+++ b/ethbarcelona/.gitignore
@@ -2,6 +2,7 @@
# dependencies
/node_modules
+**/node_modules
/.pnp
.pnp.js