Skip to content

Commit

Permalink
Changes to rollups v2
Browse files Browse the repository at this point in the history
  • Loading branch information
tuler committed Nov 5, 2024
1 parent f94966d commit f0ff7dc
Show file tree
Hide file tree
Showing 22 changed files with 426 additions and 522 deletions.
11 changes: 11 additions & 0 deletions .changeset/fair-ladybugs-work.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@deroll/create-app": major
"@deroll/wallet": major
"@deroll/app": major
"@deroll/core": major
"@deroll/router": major
"@deroll/examples": major
"@deroll/docs": major
---

rollups v2
2 changes: 1 addition & 1 deletion apps/docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"@types/react": "latest",
"react": "latest",
"react-dom": "latest",
"vocs": "latest"
"vocs": "1.0.0-alpha.61"
},
"devDependencies": {
"@deroll/app": "workspace:*",
Expand Down
1 change: 1 addition & 0 deletions apps/docs/pages/app/create-voucher.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ app.addAdvanceHandler(async (data) => {
functionName: "transfer", // [!code focus]
args: [to, amount], // [!code focus]
}), // [!code focus]
value: "0x", // [!code focus]
}); // [!code focus]
return "accept";
});
Expand Down
63 changes: 63 additions & 0 deletions apps/docs/pages/migrating.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Migrating

## From v1 to v2

Deroll v1 is based on Cartesi Rollups v1, while deroll v2 is based on Cartesi Rollups v2.

Here are the changes you should be aware of when migrating from v1 to v2:

### Input metadata

The input metadata received in an advance handler has changed.

```diff
+chain_id: number;
+app_contract: Address;
msg_sender: Address;
-epoch_index: number;
input_index: number;
block_number: number;
-timestamp: number;
+block_timestamp: number;
+prev_randao: Hex;
```

### Voucher value

Vouchers now have a required hex-encoded bigint `value` field, which is the amount of native token to be sent during voucher execution.
With this new property withdraw vouchers can now be much simpler.

```ts twoslash
import { createApp } from "@deroll/app";
import { encodeFunctionData, erc20Abi, parseUnits } from "viem";

// create application
const app = createApp({ url: "http://127.0.0.1:5004" });

// log incoming advance request
app.addAdvanceHandler(async (data) => {
const token = "0x491604c0FDF08347Dd1fa4Ee062a822A5DD06B5D"; // CTSI address
const to = "0x8f7599fa6fDDF2845a3beBcDCb055C7Ba1793a1f"; // CTSI recipient
const amount = parseUnits("1", 18);

const id = await app.createVoucher({
destination: token,
payload: encodeFunctionData({
abi: erc20Abi,
functionName: "transfer",
args: [to, amount],
}),
value: "0x", // [!code focus]
});
return "accept";
});
```

### Change in ERC-20 deposit input

The message format of a ERC-20 deposit dropped the byte of the success flag.
If you use the `@deroll/wallet` module this change is automatically handled for you.

### DAppAddressRelay removed

Now that the input metadata includes the application address there is no need to use the `DAppAddressRelay` contract anymore.
1 change: 1 addition & 0 deletions apps/docs/pages/vouchers.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,6 @@ const voucher: Voucher = {
functionName: "transfer",
args: [to, amount],
}),
value: "0x",
};
```
1 change: 0 additions & 1 deletion apps/docs/pages/wallet/create-withdraw-ether-voucher.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ const application = "0xab7528bb862fb57e8a2bcd567a2e929a0be56a5e";
app.addAdvanceHandler(async ({ metadata }) => {
const value = parseEther("1");
const voucher = createWithdrawEtherVoucher( // [!code focus]
application, // [!code focus]
metadata.msg_sender, // [!code focus]
value, // [!code focus]
); // [!code focus]
Expand Down
2 changes: 2 additions & 0 deletions apps/docs/pages/wallet/withdraw-batch-erc1155.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,12 @@ app.addAdvanceHandler(wallet.handler);
const token = "0x04d724738873CB6a86328D2EbAEb2079D715e61e"; // ERC-1155 address
app.addAdvanceHandler(async ({ metadata }) => {
const user = metadata.msg_sender;
const dapp = metadata.app_contract;
const value1 = wallet.erc1155BalanceOf(token, user, 1n);
const value2 = wallet.erc1155BalanceOf(token, user, 2n);
if (value1 > 0 && value2 > 0) {
const voucher = wallet.withdrawBatchERC1155( // [!code focus]
dapp, // [!code focus]
token, // [!code focus]
user, // [!code focus]
[1n, 2n], // [!code focus]
Expand Down
3 changes: 2 additions & 1 deletion apps/docs/pages/wallet/withdraw-erc1155.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ app.addAdvanceHandler(wallet.handler);
const token = "0x04d724738873CB6a86328D2EbAEb2079D715e61e"; // ERC-1155 address
app.addAdvanceHandler(async ({ metadata }) => {
const user = metadata.msg_sender;
const dapp = metadata.app_contract;
const value = wallet.erc1155BalanceOf(token, user, 1n);
if (value > 0) {
const voucher = wallet.withdrawERC1155(token, user, 1n, value, "0x"); // [!code focus]
const voucher = wallet.withdrawERC1155(dapp, token, user, 1n, value, "0x"); // [!code focus]
await app.createVoucher(voucher);
}
return "accept";
Expand Down
3 changes: 2 additions & 1 deletion apps/docs/pages/wallet/withdraw-erc721.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ app.addAdvanceHandler(wallet.handler);
const token = "0xc6582A9b48F211Fa8c2B5b16CB615eC39bcA653B"; // NFT address
app.addAdvanceHandler(async ({ metadata }) => {
const user = metadata.msg_sender;
const dapp = metadata.app_contract;
const hasOne = wallet.erc721Has(token, user, 1n);
if (hasOne) {
const voucher = wallet.withdrawERC721(token, user, 1n); // [!code focus]
const voucher = wallet.withdrawERC721(dapp, token, user, 1n); // [!code focus]
await app.createVoucher(voucher);
}
return "accept";
Expand Down
4 changes: 4 additions & 0 deletions apps/docs/vocs.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ export default defineConfig({
text: "Project Structure",
link: "/structure",
},
{
text: "Migrating from v1 to v2",
link: "/migrating",
},
{
text: "API",
items: [
Expand Down
2 changes: 1 addition & 1 deletion packages/core/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ viem types Hex and Address instead of simple strings for some schema properties.
*/

const inputFile =
"https://raw.githubusercontent.com/cartesi/openapi-interfaces/v0.7.3/rollup.yaml";
"https://raw.githubusercontent.com/cartesi/openapi-interfaces/v0.9.0/rollup.yaml";
const outputFile = "src/schema.ts";

// import types from viem in generated code
Expand Down
2 changes: 1 addition & 1 deletion packages/create-app/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ export const createApp = (options: CreateAppOptions): Task[] => {
const dockerfile = gh({
owner: "cartesi",
repo: "application-templates",
branch: "main",
branch: "sdk-0.12",
path: "typescript/Dockerfile",
});

Expand Down
63 changes: 41 additions & 22 deletions packages/wallet/__tests__/deposit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
encodeAbiParameters,
encodePacked,
parseAbiParameters,
zeroHash,
} from "viem";
import { describe, expect, test } from "vitest";

Expand All @@ -20,15 +21,18 @@ import {
describe("deposit", () => {
test("ETH", async () => {
const wallet = createWallet();
const dapp = "0xab7528bb862fB57E8A2BCd567a2e929a0Be56a5e";
const sender = "0x18930e8a66a1DbE21D00581216789AAB7460Afd0";
const value = 123456n;
const payload = encodePacked(["address", "uint256"], [sender, value]);
const metadata = {
msg_sender: etherPortalAddress,
const metadata: RequestMetadata = {
app_contract: dapp,
block_number: 0,
epoch_index: 0,
block_timestamp: 0,
chain_id: 1,
input_index: 0,
timestamp: 0,
msg_sender: etherPortalAddress,
prev_randao: zeroHash,
};
const response = await wallet.handler({ metadata, payload });
expect(response).toEqual("accept");
Expand All @@ -37,18 +41,21 @@ describe("deposit", () => {

test("ETH non normalized address", async () => {
const wallet = createWallet();
const dapp = "0xab7528bb862fB57E8A2BCd567a2e929a0Be56a5e";
const sender = "0x18930e8a66a1DbE21D00581216789AAB7460Afd0";
const value = 123456n;
const payload = encodePacked(
["address", "uint256"],
[sender.toLowerCase() as Address, value],
);
const metadata = {
msg_sender: etherPortalAddress,
const metadata: RequestMetadata = {
app_contract: dapp,
block_number: 0,
epoch_index: 0,
block_timestamp: 0,
chain_id: 1,
input_index: 0,
timestamp: 0,
msg_sender: etherPortalAddress,
prev_randao: zeroHash,
};
const response = await wallet.handler({ metadata, payload });
expect(response).toEqual("accept");
Expand All @@ -57,20 +64,23 @@ describe("deposit", () => {

test("ERC20", async () => {
const wallet = createWallet();
const dapp = "0xab7528bb862fB57E8A2BCd567a2e929a0Be56a5e";
const sender = "0x18930e8a66a1DbE21D00581216789AAB7460Afd0";
const token = "0x491604c0FDF08347Dd1fa4Ee062a822A5DD06B5D";
const amount = 123n;
expect(wallet.erc20BalanceOf(token, sender)).toBe(0n);
const payload = encodePacked(
["bool", "address", "address", "uint256"],
[true, token, sender, amount],
["address", "address", "uint256"],
[token, sender, amount],
);
const metadata: RequestMetadata = {
msg_sender: erc20PortalAddress,
app_contract: dapp,
block_number: 0,
epoch_index: 0,
block_timestamp: 0,
chain_id: 1,
input_index: 0,
timestamp: 0,
msg_sender: erc20PortalAddress,
prev_randao: zeroHash,
};
const response = await wallet.handler({ metadata, payload });
expect(response).toBe("accept");
Expand All @@ -79,6 +89,7 @@ describe("deposit", () => {

test("ERC721", async () => {
const wallet = createWallet();
const dapp = "0xab7528bb862fB57E8A2BCd567a2e929a0Be56a5e";
const sender = "0x18930e8a66a1DbE21D00581216789AAB7460Afd0";
const token = "0x491604c0FDF08347Dd1fa4Ee062a822A5DD06B5D";
const tokenId = 123n;
Expand All @@ -88,11 +99,13 @@ describe("deposit", () => {
[token, sender, tokenId],
);
const metadata: RequestMetadata = {
msg_sender: erc721PortalAddress,
app_contract: dapp,
block_number: 0,
epoch_index: 0,
block_timestamp: 0,
chain_id: 1,
input_index: 0,
timestamp: 0,
msg_sender: erc721PortalAddress,
prev_randao: zeroHash,
};
const response = await wallet.handler({ metadata, payload });
expect(response).toBe("accept");
Expand All @@ -101,6 +114,7 @@ describe("deposit", () => {

test("ERC1155", async () => {
const wallet = createWallet();
const dapp = "0xab7528bb862fB57E8A2BCd567a2e929a0Be56a5e";
const sender = "0x18930e8a66a1DbE21D00581216789AAB7460Afd0";
const token = "0x491604c0FDF08347Dd1fa4Ee062a822A5DD06B5D";
const tokenId = 1n;
Expand All @@ -111,11 +125,13 @@ describe("deposit", () => {
[token, sender, tokenId, value],
);
const metadata: RequestMetadata = {
msg_sender: erc1155SinglePortalAddress,
app_contract: dapp,
block_number: 0,
epoch_index: 0,
block_timestamp: 0,
chain_id: 1,
input_index: 0,
timestamp: 0,
msg_sender: erc1155SinglePortalAddress,
prev_randao: zeroHash,
};
const response = await wallet.handler({ metadata, payload });
expect(response).toBe("accept");
Expand All @@ -124,6 +140,7 @@ describe("deposit", () => {

test("multiple ERC1155", async () => {
const wallet = createWallet();
const dapp = "0xab7528bb862fB57E8A2BCd567a2e929a0Be56a5e";
const sender = "0x18930e8a66a1DbE21D00581216789AAB7460Afd0";
const token = "0x491604c0FDF08347Dd1fa4Ee062a822A5DD06B5D";
const tokenIds = [1n, 2n];
Expand All @@ -136,11 +153,13 @@ describe("deposit", () => {
[tokenIds, values],
);
const metadata: RequestMetadata = {
msg_sender: erc1155BatchPortalAddress,
app_contract: dapp,
block_number: 0,
epoch_index: 0,
block_timestamp: 0,
chain_id: 1,
input_index: 0,
timestamp: 0,
msg_sender: erc1155BatchPortalAddress,
prev_randao: zeroHash,
};
const response = await wallet.handler({
metadata,
Expand Down
9 changes: 6 additions & 3 deletions packages/wallet/__tests__/noop.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { zeroHash } from "viem";
import { describe, expect, test } from "vitest";

import { createWallet } from "../src";
Expand All @@ -20,11 +21,13 @@ describe("noop", () => {
const wallet = createWallet();
const response = await wallet.handler({
metadata: {
msg_sender: "0x18930e8a66a1DbE21D00581216789AAB7460Afd0",
app_contract: "0xab7528bb862fB57E8A2BCd567a2e929a0Be56a5e",
block_number: 0,
epoch_index: 0,
block_timestamp: 0,
chain_id: 1,
input_index: 0,
timestamp: 0,
msg_sender: "0x18930e8a66a1DbE21D00581216789AAB7460Afd0",
prev_randao: zeroHash,
},
payload: "0xdeadbeef",
});
Expand Down
Loading

0 comments on commit f0ff7dc

Please sign in to comment.