-
Notifications
You must be signed in to change notification settings - Fork 5.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: create and deploy a reference proxy contract for contracts with [proxy]
enabled
#6069
Changes from all commits
9f406fd
96d9dd1
0597998
725d220
4c962d5
81c3559
985162e
22169f4
3980804
0270010
aa0fd68
61afabf
263c4f9
be69778
1a673ce
7d04050
1ac2803
ad73213
3150f6e
2b3180a
47c8778
71888b4
86f6a29
fc25d5a
c3ad31b
a03530e
b5893f1
5f50d12
3aff635
a618d89
0019efa
8628280
e96b983
bc59a7b
4edbebb
6e9958f
1184d61
eb53abe
fbeb7cf
65a380d
38b3d43
17b2bd7
a14e437
1ae122d
4e5e421
ef35fb9
5b12a4a
680cb0b
34f0f02
9253ba7
ba2f92e
0aad88d
8a1ab5d
530ec77
f302d74
809c2c1
bd1f0a5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -1,26 +1,62 @@ | ||||||
# `forc-client` | ||||||
|
||||||
Forc plugin for interacting with a Fuel node. | ||||||
Forc plugin for interacting with a Fuel node. Since transactions are going to require some gas, you need to sign them with an account that has enough tokens to pay for them. | ||||||
|
||||||
## Initializing the wallet and adding accounts | ||||||
We offer multiple ways to sign the transaction: | ||||||
|
||||||
If you don't have an initialized wallet or any account for your wallet you won't be able to sign transactions. | ||||||
1. Sign the transaction via your local wallet using `forc-client` which integrates with our CLI wallet, `forc-wallet`. | ||||||
2. Use the default signer to deploy to a local node | ||||||
3. Use `forc-wallet` to manually sign transactions, and copy the signed transaction back to `forc-client`. | ||||||
|
||||||
To create a wallet you can use `forc wallet new`. It will ask you to choose a password to encrypt your wallet. After the initialization is done you will have your mnemonic phrase. | ||||||
The easiest and recommended way to interact with deployed networks such as our testnets is option 1, using `forc-client` to sign your transactions which reads your default `forc-wallet` vault. For interacting with local node, we recommend using the second option, which leads `forc-client` to sign transactions with the a private key that comes pre-funded in local environments. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh looks like it got auto merged, I'll address these with the follow-up, thanks! |
||||||
|
||||||
After you have created a wallet, you can derive a new account by running `forc wallet account new`. It will ask your password to decrypt the wallet before deriving an account. | ||||||
## Option 1: Sign transactions via forc-client using your local forc-wallet vault | ||||||
|
||||||
## Signing transactions using `forc-wallet` CLI | ||||||
If you've used `forc-wallet` before, you'll already have a secure, password-protected vault holding your private key written to your file-system. `forc-client` is compatible with `forc-wallet` such that it can read that vault by asking you your password and use your account to sign transactions. | ||||||
|
||||||
To submit the transactions created by `forc deploy` or `forc run`, you need to sign them first (unless you are using a client without UTXO validation). To sign a transaction you can use `forc-wallet` CLI. This section is going to walk you through the whole signing process. | ||||||
Example: | ||||||
|
||||||
By default `fuel-core` runs without UTXO validation, this allows you to send invalid inputs to emulate different conditions. | ||||||
```console | ||||||
> forc deploy | ||||||
|
||||||
If you want to run `fuel-core` with UTXO validation, you can pass `--utxo-validation` to `fuel-core run`. | ||||||
Building /Users/yourname/test-projects/test-contract | ||||||
Finished release [optimized + fuel] target(s) in 11.39s | ||||||
Confirming transactions [deploy impl-contract] | ||||||
Network: https://testnet.fuel.network | ||||||
Wallet: /Users/yourname/.fuel/wallets/.wallet | ||||||
✔ Wallet password · ******** | ||||||
? Wallet account › | ||||||
❯ [0] fuel12pls73y9hnqdqthvduy2x44x48zt8s50pkerf32kq26f2afeqdwq6rj9ar - 0.002197245 ETH | ||||||
[1] fuel1vzrm6kw9s3tv85gl25lpptsxrdguyzfhq6c8rk07tr6ft5g45nwqqh0uty - 0.001963631 ETH | ||||||
? Do you agree to sign 1 transaction? (y/n) › yes | ||||||
Finished deploying impl-contract https://app.fuel.network/contract/0x94b712901f04332682d14c998a5fc5a078ed15321438f46d58d0383200cde43d | ||||||
Deployed in block https://app.fuel.network/block/5958351 | ||||||
``` | ||||||
|
||||||
As it can be seen from the example, `forc-client` asks for your password to decrypt the `forc-wallet` vault, and list your accounts so that you can select the one you want to fund the transaction with. | ||||||
|
||||||
## Option 2: Using default signer | ||||||
|
||||||
To install `forc-wallet` please refer to `forc-wallet`'s [GitHub repo](https://github.com/FuelLabs/forc-wallet#forc-wallet). | ||||||
If you are not interacting with a deployed network, such as testnets, your local `fuel-core` environment can be structured such that it funds an account by default. Using `--default-signer` flag with `forc-client` binaries (run, deploy) will instruct `forc-client` to sign transactions with this pre-funded account. Which makes it a useful command while working against a local node. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
||||||
1. Construct the transaction by using either `forc deploy` or `forc run`. To do so simply run `forc deploy` or `forc run` with your desired parameters. For a list of parameters please refer to the [forc-deploy](./forc_deploy.md) or [forc-run](./forc_run.md) section of the book. Once you run either command you will be asked the address of the wallet you are going to be signing with. After the address is given the transaction will be generated and you will be given a transaction ID. At this point CLI will actively wait for you to insert the signature. | ||||||
Example: | ||||||
|
||||||
```console | ||||||
> forc deploy --default-signer | ||||||
|
||||||
Building /Users/test/test-projects/test-contract | ||||||
Finished release [optimized + fuel] target(s) in 11.40s | ||||||
Confirming transactions [deploy impl-contract] | ||||||
Network: http://127.0.0.1:4000 | ||||||
Finished deploying impl-contract 0xf9fb08ef18ce226954270d6d4f67677d484b8782a5892b3d436572b405407544 | ||||||
Deployed in block 00000001 | ||||||
``` | ||||||
|
||||||
## Option 3: Manually signing through forc-wallet (Deprecated) | ||||||
|
||||||
This option is for creating the transaction first, signing it manually and supplying the signed transaction back to forc-client. Since it requires multiple steps, it is more error-prone and not recommended for general use case. Also this will be deprecated soon. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
||||||
1. Construct the transaction by using either `forc deploy` or `forc run`. To do so simply run `forc deploy --manual-sign` or `forc run --manual-sign` with your desired parameters. For a list of parameters please refer to the [forc-deploy](./forc_deploy.md) or [forc-run](./forc_run.md) section of the book. Once you run either command you will be asked the address of the wallet you are going to be signing with. After the address is given the transaction will be generated and you will be given a transaction ID. At this point CLI will actively wait for you to insert the signature. | ||||||
2. Take the transaction ID generated in the first step and sign it with `forc wallet sign --account <account_index> tx-id <transaction_id>`. This will generate a signature. | ||||||
3. Take the signature generated in the second step and provide it to `forc-deploy` (or `forc-run`). Once the signature is provided, the signed transaction will be submitted. | ||||||
|
||||||
|
@@ -56,7 +92,7 @@ By default `--default-signer` flag would sign your transactions with the followi | |||||
|
||||||
## Interacting with the testnet | ||||||
|
||||||
To interact with the latest testnet, use the `--testnet` flag. When this flag is passed, transactions created by `forc-deploy` will be sent to the `beta-4` testnet. | ||||||
To interact with the latest testnet, use the `--testnet` flag. When this flag is passed, transactions created by `forc-deploy` will be sent to the latest `testnet`. | ||||||
|
||||||
```sh | ||||||
forc-deploy --testnet | ||||||
|
@@ -68,10 +104,10 @@ It is also possible to pass the exact node URL while using `forc-deploy` or `for | |||||
forc-deploy --node-url https://beta-3.fuel.network | ||||||
``` | ||||||
|
||||||
Another alternative is the `--target` option, which provides useful aliases to all targets. For example if you want to deploy to `beta-3` you can use: | ||||||
Another alternative is the `--target` option, which provides useful aliases to all targets. For example if you want to deploy to `beta-5` you can use: | ||||||
|
||||||
```sh | ||||||
forc-deploy --target beta-3 | ||||||
forc-deploy --target beta-5 | ||||||
``` | ||||||
|
||||||
Since deploying and running projects on the testnet cost gas, you will need coins to pay for them. You can get some using the [testnet faucet](https://faucet-testnet.fuel.network/). | ||||||
|
@@ -91,3 +127,40 @@ forc-deploy saves the details of each deployment in the `out/deployments` folder | |||||
"deployed_block_id": "0x915c6f372252be6bc54bd70df6362dae9bf750ba652bf5582d9b31c7023ca6cf" | ||||||
} | ||||||
``` | ||||||
|
||||||
## Proxy Contracts | ||||||
|
||||||
`forc-deploy` supports deploying proxy contracts automatically if it is enabled in the `Forc.toml` of the contract. | ||||||
|
||||||
```TOML | ||||||
[project] | ||||||
name = "test_contract" | ||||||
authors = ["Fuel Labs <[email protected]>"] | ||||||
entry = "main.sw" | ||||||
license = "Apache-2.0" | ||||||
implicit-std = false | ||||||
|
||||||
[proxy] | ||||||
enabled = true | ||||||
``` | ||||||
|
||||||
If there is no `address` field present under the proxy table, like the example above, `forc` will automatically create a proxy contract based on the [SRC-14](https://github.com/FuelLabs/sway-standards/blob/master/docs/src/src-14-simple-upgradeable-proxies.md) implementation from [sway-standards](https://github.com/FuelLabs/sway-standards). After generating and deploying the proxy contract, the target is set to the current contract, and owner of the proxy is set to the account that is signing the transaction for deployment. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
||||||
This means that if you simply enable proxy in the `Forc.toml`, forc will automatically deploy a proxy contract for you and you do not need to do anything manually aside from signing the deployment transactions for the proxy contract. After deploying the proxy contract, the its address is added into the `address` field of the proxy table. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
||||||
If you want to update the target of an [SRC-14](https://github.com/FuelLabs/sway-standards/blob/master/docs/src/src-14-simple-upgradeable-proxies.md) compliant proxy contract rather than deploying a new one, simply add its `address` in the `address` field, like the following example: | ||||||
|
||||||
```TOML | ||||||
[project] | ||||||
name = "test_contract" | ||||||
authors = ["Fuel Labs <[email protected]>"] | ||||||
entry = "main.sw" | ||||||
license = "Apache-2.0" | ||||||
implicit-std = false | ||||||
|
||||||
[proxy] | ||||||
enabled = true | ||||||
address = "0xd8c4b07a0d1be57b228f4c18ba7bca0c8655eb6e9d695f14080f2cf4fc7cd946" # example proxy contract address | ||||||
``` | ||||||
|
||||||
If an `address` is present, `forc` calls into that contract to update its `target` instead of deploying a new contract. Since a new proxy deployment adds its own `address` into the `Forc.toml` automatically, you can simply enable the proxy once and after the initial deployment, `forc` will keep updating the target accordingly for each new deployment of the same contract. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
# Proxy Contract | ||
|
||
This folder contains pre-built version of the owned proxy contract, its abi and `storage-slots.json` file. | ||
|
||
*contract url*: [sway-standard-implementation/src-14/owned_proxy](https://github.com/FuelLabs/sway-standard-implementations/tree/61fd4ad8f69d21cec0d5cd8135bdc4495e0c125c). | ||
*commit hash*: `61fd4ad8f69d21cec0d5cd8135bdc4495e0c125c` | ||
*forc version*: `v0.62.0` | ||
*build command*: `forc build --release` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should be assets or coins as there are no tokens on Fuel 🙂
https://docs.fuel.network/docs/sway/blockchain-development/native_assets/#asset-vs-coin-vs-token