---
# System prepended metadata

title: Get started with Casper

---

**Hackathon: The Friendly Hackathon: Start Building on Casper!**
# Get started with Casper

## Task 1:Create and deploy a simple, smart contract with cargo casper and cargo test

> ***Sending a Deployment to the Testnet***

![](https://i.imgur.com/ht2IpdR.png)

> ***Check to see that the contract executed properly, and that the block was finalized***

![](https://i.imgur.com/otUyzw3.png)

## Task 2:Complete one of the existing tutorials for writing smart contracts

### Multi-signatures and key recovery

![](https://i.imgur.com/XNLf9Cj.png)
![](https://i.imgur.com/7GevegK.png)
![](https://i.imgur.com/S8ASlMR.png)
![](https://i.imgur.com/JdbxRvh.png)
![](https://i.imgur.com/mcmbnEC.png)
![](https://i.imgur.com/c2pebS8.png)
![](https://i.imgur.com/mELg7JM.png)
![](https://i.imgur.com/Tb7rK0B.png)
![](https://i.imgur.com/lmqChAm.png)
![](https://i.imgur.com/PAclibc.png)
![](https://i.imgur.com/RFaot0h.png)
![](https://i.imgur.com/HJGNgkW.png)
![](https://i.imgur.com/9AB6P1G.png)



## Task 3:Demonstrate key management concepts by modifying the client in the Multi-Sig tutorial to address one of the additional scenarios

### Scenario 6: losing your primary account key

> ***Building the scenario code***

```
const keyManager = require('./key-manager');
const TRANSFER_AMOUNT = process.env.TRANSFER_AMOUNT || 2500000000;

(async function () {

    // Scenario #6 Description:
    // Suppose you lose your account key; in this case, “account-hash-00…”, you can set up other keys to execute transactions.
    // Although not recommended, you can throw away the private key of your account or set its weight to zero,
    // and you would still be able to execute transactions if your faucet account has backup keys that can perform key management.

    // So we will need 6 keys.
    // It would be 'mainAccount','safeAccount','safeAccount1','safeAccount2','browserAccount' and 'mobileAccount'.
    // To deploy updates to the Account we will use 'setAll' function of the keyManager.
    // After losing the main key, we will set it's weight to 0

    // To achieve the task, we will:
    // 1. Set weight of mainAccount and safe accounts to 3.
    // 2. Set weight of browserAccount and mobileAccount to 1.
    // 3. Set Keys Management Threshold to 3.
    // 4. Set Deploy Threshold to 2.
    // 5. Deploy account changes using 'setAll' function.
    // 6. Set weight of lost mainAccount key to 0.

    const masterKey = keyManager.randomMasterKey();
    const mainAccount = masterKey.deriveIndex(1);
    const safeAccount1 = masterKey.deriveIndex(2);
    const safeAccount2 = masterKey.deriveIndex(3);
    const safeAccount3 = masterKey.deriveIndex(4);
    const browserAccount = masterKey.deriveIndex(5);
    const mobileAccount = masterKey.deriveIndex(6);

    console.log("Main account: " + mainAccount.publicKey.toHex());
    console.log("Safe account #1: " + safeAccount1.publicKey.toHex());
    console.log("Safe account #2: " + safeAccount2.publicKey.toHex());
    console.log("Safe account #3: " + safeAccount3.publicKey.toHex());
    console.log("Browser account: " + browserAccount.publicKey.toHex());
    console.log("Mobile account: " + mobileAccount.publicKey.toHex());

    let deploy;

    console.log("\n0.1 Funding safe account.");
    await keyManager.fundAccount(mainAccount);
    await keyManager.printAccount(mainAccount);

    console.log("\n0.2 Install Keys Manager contract");
    deploy = keyManager.keys.buildContractInstallDeploy(mainAccount);
    await keyManager.sendDeploy(deploy, [mainAccount]);
    await keyManager.printAccount(mainAccount);

    // 1. Set weight of mainAccount and safe accounts to 3.
    const safeAccountWeight = 3;
    // 2. Set weight of browserAccount and mobileAccount to 1.
    const keyAccountWeight = 1;
    const accounts = [
        { publicKey: mainAccount.publicKey, weight: safeAccountWeight },
        { publicKey: safeAccount1.publicKey, weight: safeAccountWeight },
        { publicKey: safeAccount2.publicKey, weight: safeAccountWeight },
        { publicKey: safeAccount3.publicKey, weight: safeAccountWeight },
        { publicKey: browserAccount.publicKey, weight: keyAccountWeight },
        { publicKey: mobileAccount.publicKey, weight: keyAccountWeight },
    ];

    // 3. Set Keys Management Threshold to 3.
    const keyManagementThreshold = 3;
    // 4. Set Deploy Threshold to 2.
    const deployThreshold = 2;

    // 5. Deploy account changes using 'setAll' function.
    console.log("\n 1. Set weight of mainAccount and safe accounts to 3.");
    console.log("\n 2. Set weight of browserAccount and mobileAccount to 1.");
    console.log("\n 3. Set Keys Management Threshold to 3.");
    console.log("\n 4. Set Deploy Threshold to 2.");
    console.log("\n 5. Update keys deploy.");

    deploy = keyManager.keys.setAll(mainAccount, deployThreshold, keyManagementThreshold, accounts);
    await keyManager.sendDeploy(deploy, [mainAccount]);
    await keyManager.printAccount(mainAccount);

    // 6. Set weight of lost mainAccount key to 0.
    const lostAccountWeight = 0;
    console.log("\n 6. Set weight of lost mainAccount key to 0.");
    deploy = keyManager.keys.setKeyWeightDeploy(mainAccount,mainAccount,lostAccountWeight);
    await keyManager.sendDeploy(deploy, [safeAccount1]);
    await keyManager.printAccount(mainAccount);

})();
```

> ***Final deployment***

![](https://i.imgur.com/OHsiz4q.png)
![](https://i.imgur.com/PJPEA6Q.png)
![](https://i.imgur.com/j45mQDW.png)
![](https://i.imgur.com/Q24GvZ2.png)
![](https://i.imgur.com/CBobZCr.png)
![](https://i.imgur.com/iYXTMbs.png)
![](https://i.imgur.com/FfC4s2I.png)


## Task4:Learn to transfer tokens to an account on the Casper Testnet

> ***Transfer***

![](https://i.imgur.com/lI4vsm2.png)

> ***Deploy Status***

![](https://i.imgur.com/a9G6h6a.png)

## Task 5:Learn to Delegate and Undelegate on the Casper Testnet

> ***Delegate***

![](https://i.imgur.com/NGP9y0G.png)


> ***Undelegate***


![](https://i.imgur.com/OXpOj6C.png)


