# Get started with Casper
### 1. Create and deploy a simple, smart contract with cargo casper and cargo test
Create a project called project1 with cargo casper
![](https://i.imgur.com/GrNVhu7.png)
Once the project is created move to tests folder and run cargo test
![](https://i.imgur.com/XwkJrND.png)
The final result shows the successful creation and test of a simple contract.
![](https://i.imgur.com/zfeYgZ9.png)
### 2. Complete one of the existing tutorials for writing smart contracts
I completed the Multi-signature tutorial for this task.
Clone the tutorial and build smart contract
![](https://i.imgur.com/xdoKvp8.png)
Set up Local Network and view the Network State
![](https://i.imgur.com/JJ7lKUd.png)
Setting up the client
![](https://i.imgur.com/Y9NU8BO.png)
Testing the client
![](https://i.imgur.com/nh33T07.png)
Final State
![](https://i.imgur.com/bMQYq05.png)
### 3. Demonstrate key management concepts by modifying the client in the Multi-Sig tutorial to address one of the additional scenarios
Scenario Two - deploying with special keys
scenario-two.js code
```javascript
const keyManager = require('./key-manager');
const TRANSFER_AMOUNT = process.env.TRANSFER_AMOUNT || 2500000000;
(async function() {
// In this example, I am implementing scenario 2
// There are two keys main (which can do both deployment and key management)
// and secondary which can only do deployment but not key management
// To achive the task, we will:
// 1. Set mainAccount's weight to 2.
// 2. Set Keys Management Threshold to 2.
// 3. Set Deploy Threshold to 1.
// 4. Add new key with weight 1 (secondary account).
// 5. Make a transfer using secondary account. (should succeed)
// 6. Add new key using secondary account. (should fail)
let deploy;
// init
let masterKey = keyManager.randomMasterKey();
let mainAccount = masterKey.deriveIndex(1);// Main Account
let secondaryAccount = masterKey.deriveIndex(2);//Secondary Account
let testAccount = masterKey.deriveIndex(3);// Test account
console.log("\n0.1 Fund main account.\n");
await keyManager.fundAccount(mainAccount);
await keyManager.printAccount(mainAccount);
console.log("\n[x]0.2 Install Keys Manager contract");
deploy = keyManager.keys.buildContractInstallDeploy(mainAccount);
await keyManager.sendDeploy(deploy, [mainAccount]);
await keyManager.printAccount(mainAccount);
// 1. Set mainAccount's weight to 2
console.log("\n1. Set faucet's weight to 2\n");
deploy = keyManager.keys.setKeyWeightDeploy(mainAccount, mainAccount, 2);
await keyManager.sendDeploy(deploy, [mainAccount]);
await keyManager.printAccount(mainAccount);
// 2. Set Keys Management Threshold to 2.
console.log("\n2. Set Keys Management Threshold to 2\n");
deploy = keyManager.keys.setKeyManagementThresholdDeploy(mainAccount, 2);
await keyManager.sendDeploy(deploy, [mainAccount]);
await keyManager.printAccount(mainAccount);
// 3. Set Deploy Threshold to 1.
console.log("\n3. Set Deploy Threshold to 1.\n");
deploy = keyManager.keys.setDeploymentThresholdDeploy(mainAccount, 1);
await keyManager.sendDeploy(deploy, [mainAccount]);
await keyManager.printAccount(mainAccount);
// 4. Add secondary key with weight 1 which can only deploy.
console.log("\n4. Add secondary key with weight 1.\n");
deploy = keyManager.keys.setKeyWeightDeploy(mainAccount, secondaryAccount, 1);
await keyManager.sendDeploy(deploy, [mainAccount]);
await keyManager.printAccount(mainAccount);
// 6. Make a transfer from faucet using the secondary account.
console.log("\n6. Make a transfer from faucet using the secondary account.\n");
deploy = keyManager.transferDeploy(mainAccount, secondaryAccount, TRANSFER_AMOUNT);
await keyManager.sendDeploy(deploy, [secondaryAccount]);
await keyManager.printAccount(mainAccount);
// 7. Add test key with weight 1 using secondary account.
console.log("\n7. Add first new key with weight 1 using the secondary account. Should Fail\n");
deploy = keyManager.keys.setKeyWeightDeploy(mainAccount, testAccount, 1);
await keyManager.sendDeploy(deploy, [secondaryAccount]);
await keyManager.printAccount(mainAccount);
})();
```
![](https://i.imgur.com/3jrYYJE.png)
npm run start:two
![](https://i.imgur.com/MyRHgK0.png)
Secondary key can only perform deployment but not key management.
6. Make a transfer from faucet using the secondary account. (Successful)
![](https://i.imgur.com/30NTeN0.png)
7. Add test key with weight 1 using secondary account. (Failure)
![](https://i.imgur.com/yP9WTLk.png)
### 4. Learn to transfer tokens to an account on the Casper Testnet.
A Transfer of 3 CSPR from one account to another.
![](https://i.imgur.com/Y7y5CXx.png)
Check Deployment Status using deploy_hash
![](https://i.imgur.com/ShX7kW9.png)
Get State Root Hash using block_hash
![](https://i.imgur.com/14dpWcg.png)
Query the Source Account using state root hash
![](https://i.imgur.com/yLbC97G.png)
Query the Target Account using state root hash
![](https://i.imgur.com/80FAP11.png)
Query the source and target account balances one by one
![](https://i.imgur.com/AhIZlqA.png)
Query full transfer details
![](https://i.imgur.com/19xHBuz.png)
Testenet Explorer
Source Account
https://testnet.cspr.live/account/01d722236475bb58a4b25af13b0b861fd5f12fe9767e67562393bf8a2cbf65e34b
Target Account
https://testnet.cspr.live/account/01bda75a3e3dc96673bd315f35f3834a9319f44c9cb6785d2e482a11b54bab6168
Deploy Hash
https://testnet.cspr.live/deploy/b0fe96be82cf8af90289babb54606459a495227cad2e185c1c667975c9bb1810
### 5. Learn to Delegate and Undelegate on the Casper Testnet.
Delegating 100 CSPR on Casper Testnet
Sign the transaction
![](https://i.imgur.com/35DHiLM.png)
100 CSPR staked
![](https://i.imgur.com/f8Tb2NO.png)
Staking Rewards after 4+ hours of staking
![](https://i.imgur.com/PLAfHGi.png)
Undelegate 100 CSPR + rewards
![](https://i.imgur.com/DKbRzqJ.png)
Undelegated 100.08 CSPR
![](https://i.imgur.com/pGDgAT9.png)
Account Status 24 hours after undelegating
![](https://i.imgur.com/vKxXQkL.png)