Smart Contract

RideShare

A.b576a3926d239682.RideShare

Valid From

126,810,298

Deployed

1w ago
Feb 19, 2026, 11:55:31 PM UTC

Dependents

4 imports
1import FlowToken from 0x1654653399040a61
2import FungibleToken from 0xf233dcee88fe0abe
3
4access(all) contract RideShare {
5
6  access(self) let FlowTokenVault: Capability<&{FungibleToken.Receiver}>
7  access(self) let DriverFlowTokenVault: {UInt: Capability<&{FungibleToken.Receiver}>}
8  access(self) let info: Info
9  access(self) var totalDrivers: UInt // Driver ID
10
11  /* 構造体 */
12  access(all) struct Info {
13
14    access(contract) var driverData: {UInt: DriverData}
15    access(contract) var orderQueue: [Order]
16
17    /* setter */
18    access(contract) fun setDriver(id: UInt, keys: [String], values: [String]): UInt {
19      if let saved = self.driverData[id] {
20        for index, key in keys {
21          saved.set(key: key, value: values[index])
22        }
23        self.driverData[id] = saved // 更新
24        return id
25      } else {
26        // 新規登録
27        RideShare.totalDrivers = RideShare.totalDrivers + 1
28        var data = DriverData()
29        for index, key in keys {
30          data.set(key: key, value: values[index])
31        }
32        self.driverData[RideShare.totalDrivers] = data
33        return RideShare.totalDrivers
34      }
35    }
36
37    access(contract) fun setOrder(execTime: UFix64, driverId: UInt, start: String, goal: String, wage: UFix64) {
38      var order = Order(execTime: execTime, driverId: driverId, start: start, goal: goal, wage: wage)
39      self.orderQueue.append(order)
40      
41    }
42
43    init() {
44      self.driverData = {}
45      self.orderQueue = []
46    }
47  }
48
49
50  /* Info内の構造体 */
51  access(all) struct DriverData {
52
53    access(contract) var data: {String: String}
54
55    /* setter */
56    access(contract) fun set(key: String, value: String) {
57      self.data[key] = value
58    }
59
60    init() {
61      self.data = {}
62    }
63  }
64
65  /* Info内の構造体 */
66  access(all) struct Order {
67
68    access(all) let execTime: UFix64
69    access(all) let driverId: UInt
70    access(all) let start: String
71    access(all) let goal: String
72    access(all) let wage: UFix64
73
74    init(execTime: UFix64, driverId: UInt, start: String, goal: String, wage: UFix64) {
75      self.execTime = execTime
76      self.driverId = driverId
77      self.start = start
78      self.goal = goal
79      self.wage = wage
80    }
81  }
82
83  // GET
84  access(all) fun getInfo(): Info {
85    return self.info
86  }
87  // PUT
88  access(all) fun setDriverInfo(driverId: UInt, keys: [String], values: [String], flow_vault_receiver: Capability<&{FungibleToken.Receiver}>?) {
89    let _driverId = RideShare.info.setDriver(id: driverId, keys: keys, values: values)
90    if (flow_vault_receiver != nil) {
91      RideShare.DriverFlowTokenVault[_driverId] = flow_vault_receiver
92    }
93  }
94
95  // PUT
96  access(all) fun newOrder(payment: @FlowToken.Vault, execTime: UFix64, driverId: UInt, start: String, goal: String) {
97    self.info.setOrder(execTime: execTime, driverId: driverId, start: start, goal: goal, wage: payment.balance * 0.97)
98    self.FlowTokenVault.borrow()!.deposit(from: <- payment)
99  }
100
101  access(all) resource Admin {
102    // ORDER COMPLETE
103    access(all) fun payWage(driverId: UInt, wage: UFix64) {
104      pre {
105        RideShare.DriverFlowTokenVault[driverId] != nil: "Deposit destination is nil, so we can't send wage."
106      }
107      // Pay the wage.
108      let wage <- RideShare.account.storage.borrow<auth(FungibleToken.Withdraw) &{FungibleToken.Provider}>(from: /storage/flowTokenVault)!.withdraw(amount: wage) as! @FlowToken.Vault
109      RideShare.DriverFlowTokenVault[driverId]!.borrow()!.deposit(from: <- wage)
110    }
111  }
112
113  init() {
114    self.info = Info()
115    self.FlowTokenVault = self.account.capabilities.get<&{FungibleToken.Receiver}>(/public/flowTokenReceiver)
116    self.DriverFlowTokenVault = {}
117    self.totalDrivers = 0
118    self.account.storage.save( <- create Admin(), to: /storage/RideShareAdmin)
119  }
120}
121