Skip to content

Commit

Permalink
feat: Anvil sandbox and Starknet sovereign behind unsafe proxy (#8)
Browse files Browse the repository at this point in the history
* Anvil sandbox and Starknet sovereign behind unsafe proxy

* Cargo fmt; More options for sandbox attach; Artifact instructions

* Send message to L2: specify message fee

* Fixups

* Review fixups
  • Loading branch information
Michael Zaikin authored Jan 28, 2024
1 parent 998f5e0 commit 9fe4217
Show file tree
Hide file tree
Showing 18 changed files with 595 additions and 141 deletions.
14 changes: 14 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# TODO: this can be rewritten as build.rs in the sandbox crate,
# but it might introduce unnecessary friction and longer build times.
# Moreover, any project using sandbox as dependency won't build unless
# there's Foundry installed on the machine.

.PHONY: artifacts

artifacts:
mkdir crates/sandbox/artifacts || true
forge build
cp out/UnsafeProxy.sol/UnsafeProxy.json crates/sandbox/artifacts/
cp out/StarknetSovereign.sol/Starknet.json crates/sandbox/artifacts/
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,15 @@ Kill Anvil deployment:
./script/sn-base-kill.sh
```

### Artifacts

Zaun sandbox crate can be used as dev dependency in external projects for integration testing.
If any changes made to the Solidity contracts, one has to re-generate Ethers bindings (this won't be done automatically).

```bash
make artifacts
```

### StarkNet Consensus Protocol Contracts

PoC solidity implementation of the following Starknet Decentralized Protocol proposal:
Expand Down
3 changes: 3 additions & 0 deletions crates/sandbox/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,6 @@ dirs = { workspace = true }
serde_json = { workspace = true }
thiserror = { workspace = true }
hex = { workspace = true }

[dev-dependencies]
tokio = { version = "1.29.1", features = ["rt", "macros", "parking_lot"] }
1 change: 1 addition & 0 deletions crates/sandbox/artifacts/Starknet.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions crates/sandbox/artifacts/UnsafeProxy.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"abi":[{"type":"constructor","inputs":[{"name":"_delegate","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"fallback","stateMutability":"payable"}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5060405161012f38038061012f83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b609d806100926000396000f3fe6000805460a0602036601f8101829004909102820160405260808181526001600160a01b039093169392918391908190838280828437600092018290525084519495509384935091505060208401855af43d604051816000823e8280156063578282f35b8282fdfea26469706673582212204d5b20b54cc45decc224295a027d46c0605e53c658b59ea56ea1c02b352b252e64736f6c63430008100033","sourceMap":"495:626:0:-:0;;;601:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;642:8;:20;;-1:-1:-1;;;;;;642:20:0;-1:-1:-1;;;;;642:20:0;;;;;;;;;;495:626;;14:290:1;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:1;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:1:o;:::-;495:626:0;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6000805460a0602036601f8101829004909102820160405260808181526001600160a01b039093169392918391908190838280828437600092018290525084519495509384935091505060208401855af43d604051816000823e8280156063578282f35b8282fdfea26469706673582212204d5b20b54cc45decc224295a027d46c0605e53c658b59ea56ea1c02b352b252e64736f6c63430008100033","sourceMap":"713:14:0:-:0;730:8;;748:28;;768:8;748:28;;;;;;;;;;;495:626;748:28;495:626;748:28;;;-1:-1:-1;;;;;730:8:0;;;;713:14;495:626;713:14;;768:8;;;713:14;768:8;;713:14;748:28;;;;;;;;-1:-1:-1;867:11:0;;748:28;;-1:-1:-1;748:28:0;;;-1:-1:-1;867:11:0;-1:-1:-1;;860:4:0;851:14;;843:6;836:5;823:62;910:16;956:4;950:11;995:4;993:1;989:3;974:26;1020:6;1039:25;;;;1097:4;1093:3;1086:16;1039:25;1058:4;1054:3;1047:16","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.16+commit.07a7930e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/UnsafeProxy.sol\":\"UnsafeProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":cairo-lang/=lib/cairo-lang/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":starknet-cc/=lib/cairo-lang/src/starkware/starknet/solidity/\",\":starknet-token/=lib/starknet-token/src/starkware/isd/\",\":starkware/isd/=lib/starknet-token/src/starkware/isd/\",\":starkware/solidity/=lib/cairo-lang/src/starkware/solidity/\"]},\"sources\":{\"src/UnsafeProxy.sol\":{\"keccak256\":\"0x6a52f2752798e54466338fff832a7bda2bb382e1e54a37919dc4bb532a190740\",\"license\":\"Apache-2.0.\",\"urls\":[\"bzz-raw://49520db72305d8b5b574d82d292df5b95af9817497e9602f3d902015e72dbee2\",\"dweb:/ipfs/QmZsGnE3AGUr5u9kDYryksbZ6v2RudsnhqH5hhtsA1CH2t\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.16+commit.07a7930e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"stateMutability":"payable","type":"fallback"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["cairo-lang/=lib/cairo-lang/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","starknet-cc/=lib/cairo-lang/src/starkware/starknet/solidity/","starknet-token/=lib/starknet-token/src/starkware/isd/","starkware/isd/=lib/starknet-token/src/starkware/isd/","starkware/solidity/=lib/cairo-lang/src/starkware/solidity/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/UnsafeProxy.sol":"UnsafeProxy"},"libraries":{}},"sources":{"src/UnsafeProxy.sol":{"keccak256":"0x6a52f2752798e54466338fff832a7bda2bb382e1e54a37919dc4bb532a190740","urls":["bzz-raw://49520db72305d8b5b574d82d292df5b95af9817497e9602f3d902015e72dbee2","dweb:/ipfs/QmZsGnE3AGUr5u9kDYryksbZ6v2RudsnhqH5hhtsA1CH2t"],"license":"Apache-2.0."}},"version":1},"ast":{"absolutePath":"src/UnsafeProxy.sol","id":29,"exportedSymbols":{"UnsafeProxy":[28]},"nodeType":"SourceUnit","src":"469:652:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"469:24:0","nodes":[],"literals":["solidity","^","0.8",".12"]},{"id":28,"nodeType":"ContractDefinition","src":"495:626:0","nodes":[{"id":3,"nodeType":"VariableDeclaration","src":"578:16:0","nodes":[],"constant":false,"mutability":"mutable","name":"delegate","nameLocation":"586:8:0","scope":28,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2,"name":"address","nodeType":"ElementaryTypeName","src":"578:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"id":13,"nodeType":"FunctionDefinition","src":"601:68:0","nodes":[],"body":{"id":12,"nodeType":"Block","src":"632:37:0","nodes":[],"statements":[{"expression":{"id":10,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":8,"name":"delegate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3,"src":"642:8:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":9,"name":"_delegate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5,"src":"653:9:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"642:20:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":11,"nodeType":"ExpressionStatement","src":"642:20:0"}]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":6,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5,"mutability":"mutable","name":"_delegate","nameLocation":"621:9:0","nodeType":"VariableDeclaration","scope":13,"src":"613:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4,"name":"address","nodeType":"ElementaryTypeName","src":"613:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"612:19:0"},"returnParameters":{"id":7,"nodeType":"ParameterList","parameters":[],"src":"632:0:0"},"scope":28,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":27,"nodeType":"FunctionDefinition","src":"675:444:0","nodes":[],"body":{"id":26,"nodeType":"Block","src":"703:416:0","nodes":[],"statements":[{"assignments":[17],"declarations":[{"constant":false,"id":17,"mutability":"mutable","name":"target","nameLocation":"721:6:0","nodeType":"VariableDeclaration","scope":26,"src":"713:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16,"name":"address","nodeType":"ElementaryTypeName","src":"713:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":19,"initialValue":{"id":18,"name":"delegate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3,"src":"730:8:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"713:25:0"},{"assignments":[21],"declarations":[{"constant":false,"id":21,"mutability":"mutable","name":"data","nameLocation":"761:4:0","nodeType":"VariableDeclaration","scope":26,"src":"748:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20,"name":"bytes","nodeType":"ElementaryTypeName","src":"748:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":24,"initialValue":{"expression":{"id":22,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"768:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":23,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"772:4:0","memberName":"data","nodeType":"MemberAccess","src":"768:8:0","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"VariableDeclarationStatement","src":"748:28:0"},{"AST":{"nodeType":"YulBlock","src":"795:318:0","statements":[{"nodeType":"YulVariableDeclaration","src":"809:76:0","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"836:3:0"},"nodeType":"YulFunctionCall","src":"836:5:0"},{"name":"target","nodeType":"YulIdentifier","src":"843:6:0"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"855:4:0"},{"kind":"number","nodeType":"YulLiteral","src":"860:4:0","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"851:3:0"},"nodeType":"YulFunctionCall","src":"851:14:0"},{"arguments":[{"name":"data","nodeType":"YulIdentifier","src":"873:4:0"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"867:5:0"},"nodeType":"YulFunctionCall","src":"867:11:0"},{"kind":"number","nodeType":"YulLiteral","src":"880:1:0","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"883:1:0","type":"","value":"0"}],"functionName":{"name":"delegatecall","nodeType":"YulIdentifier","src":"823:12:0"},"nodeType":"YulFunctionCall","src":"823:62:0"},"variables":[{"name":"result","nodeType":"YulTypedName","src":"813:6:0","type":""}]},{"nodeType":"YulVariableDeclaration","src":"898:28:0","value":{"arguments":[],"functionName":{"name":"returndatasize","nodeType":"YulIdentifier","src":"910:14:0"},"nodeType":"YulFunctionCall","src":"910:16:0"},"variables":[{"name":"size","nodeType":"YulTypedName","src":"902:4:0","type":""}]},{"nodeType":"YulVariableDeclaration","src":"939:22:0","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"956:4:0","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"950:5:0"},"nodeType":"YulFunctionCall","src":"950:11:0"},"variables":[{"name":"ptr","nodeType":"YulTypedName","src":"943:3:0","type":""}]},{"expression":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"989:3:0"},{"kind":"number","nodeType":"YulLiteral","src":"993:1:0","type":"","value":"0"},{"name":"size","nodeType":"YulIdentifier","src":"995:4:0"}],"functionName":{"name":"returndatacopy","nodeType":"YulIdentifier","src":"974:14:0"},"nodeType":"YulFunctionCall","src":"974:26:0"},"nodeType":"YulExpressionStatement","src":"974:26:0"},{"cases":[{"body":{"nodeType":"YulBlock","src":"1046:18:0","statements":[{"expression":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"1054:3:0"},{"name":"size","nodeType":"YulIdentifier","src":"1058:4:0"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"1047:6:0"},"nodeType":"YulFunctionCall","src":"1047:16:0"},"nodeType":"YulExpressionStatement","src":"1047:16:0"}]},"nodeType":"YulCase","src":"1039:25:0","value":{"kind":"number","nodeType":"YulLiteral","src":"1044:1:0","type":"","value":"0"}},{"body":{"nodeType":"YulBlock","src":"1085:18:0","statements":[{"expression":{"arguments":[{"name":"ptr","nodeType":"YulIdentifier","src":"1093:3:0"},{"name":"size","nodeType":"YulIdentifier","src":"1097:4:0"}],"functionName":{"name":"return","nodeType":"YulIdentifier","src":"1086:6:0"},"nodeType":"YulFunctionCall","src":"1086:16:0"},"nodeType":"YulExpressionStatement","src":"1086:16:0"}]},"nodeType":"YulCase","src":"1077:26:0","value":"default"}],"expression":{"name":"result","nodeType":"YulIdentifier","src":"1020:6:0"},"nodeType":"YulSwitch","src":"1013:90:0"}]},"evmVersion":"london","externalReferences":[{"declaration":21,"isOffset":false,"isSlot":false,"src":"855:4:0","valueSize":1},{"declaration":21,"isOffset":false,"isSlot":false,"src":"873:4:0","valueSize":1},{"declaration":17,"isOffset":false,"isSlot":false,"src":"843:6:0","valueSize":1}],"id":25,"nodeType":"InlineAssembly","src":"786:327:0"}]},"implemented":true,"kind":"fallback","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":14,"nodeType":"ParameterList","parameters":[],"src":"683:2:0"},"returnParameters":{"id":15,"nodeType":"ParameterList","parameters":[],"src":"703:0:0"},"scope":28,"stateMutability":"payable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"UnsafeProxy","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"linearizedBaseContracts":[28],"name":"UnsafeProxy","nameLocation":"504:11:0","scope":29,"usedErrors":[]}],"license":"Apache-2.0."},"id":0}
Loading

0 comments on commit 9fe4217

Please sign in to comment.