---
id: TASK-37
title: Port folk-transaction-builder shape (Safe multisig)
status: Done
assignee: []
created_date: '2026-02-18 19:51'
updated_date: '2026-03-12 04:38'
labels:
  - shape-port
  - phase-4
  - web3
milestone: m-0
dependencies:
  - TASK-24
references:
  - canvas-website/src/shapes/TransactionBuilderShapeUtil.tsx
  - canvas-website/src/components/safe/TransactionComposer.tsx
  - canvas-website/src/components/safe/PendingTransactions.tsx
  - canvas-website/src/components/safe/TransactionHistory.tsx
priority: low
---

## Description

<!-- SECTION:DESCRIPTION:BEGIN -->
Port TransactionBuilderShapeUtil + Safe components from canvas-website to rspace-online.

Source: canvas-website/src/shapes/TransactionBuilderShapeUtil.tsx (157 lines) + canvas-website/src/components/safe/ (585 lines total: SafeHeader, TransactionComposer, PendingTransactions, TransactionHistory)
Target: rspace-online/lib/folk-transaction-builder.ts

Features to implement:
- Transaction composition UI (select recipient, amount, data)
- Pending transaction queue display
- Transaction history view
- Mode switching: compose/pending/history
- Safe wallet integration

May need safe-apps-sdk or ethers.js dependency (TASK-24).
<!-- SECTION:DESCRIPTION:END -->

## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 Transaction composer creates valid transactions
- [ ] #2 Pending queue displays waiting transactions
- [ ] #3 History view shows past transactions
- [ ] #4 Mode switching works (compose/pending/history)
- [ ] #5 Toolbar button added to canvas.html
<!-- AC:END -->

## Implementation Notes

<!-- SECTION:NOTES:BEGIN -->
Created folk-transaction-builder.ts canvas shape with Compose/Pending/History tabs. Compose: form for recipient, value, calldata, description with Propose button. Pending: fetches from rwallet proxy, shows confirmation count vs threshold, Confirm/Execute buttons. History: paginated executed txs with block explorer links. Supports Ethereum, Optimism, Gnosis, Polygon, Arbitrum, Base chains. Registered in canvas.html (SHAPE_DEFAULTS, toolbar Spend group, context menu). Uses existing rwallet API endpoints.
<!-- SECTION:NOTES:END -->
