Smart Contract

TaxiRide

A.b576a3926d239682.TaxiRide

Valid From

126,295,722

Deployed

1w ago
Feb 19, 2026, 10:48:54 PM UTC

Dependents

9 imports
1import FlowToken from 0x1654653399040a61
2import FungibleToken from 0xf233dcee88fe0abe
3
4access(all) contract TaxiRide {
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        TaxiRide.totalDrivers = TaxiRide.totalDrivers + 1
28        var data = DriverData()
29        for index, key in keys {
30          data.set(key: key, value: values[index])
31        }
32        self.driverData[TaxiRide.totalDrivers] = data
33        return TaxiRide.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 = TaxiRide.info.setDriver(id: driverId, keys: keys, values: values)
90    if (flow_vault_receiver != nil) {
91      TaxiRide.DriverFlowTokenVault[_driverId] = flow_vault_receiver
92    }
93  }
94
95  // 間違えて0(driverId)に入金先をセットしてしまったので解消するためのコード(orz)。1回しか使えない。nilはDriverFlowTokenVaultにセットできないので。
96  access(all) fun fixBug(driverId: UInt) {
97    pre {
98      TaxiRide.DriverFlowTokenVault[0] != nil: "nil can't be set to DriverFlowTokenVault."
99    }
100    TaxiRide.DriverFlowTokenVault[driverId] = TaxiRide.DriverFlowTokenVault[0]
101    TaxiRide.DriverFlowTokenVault[0] = nil
102  }
103
104  // PUT
105  access(all) fun newOrder(payment: @FlowToken.Vault, execTime: UFix64, driverId: UInt, start: String, goal: String) {
106    self.info.setOrder(execTime: execTime, driverId: driverId, start: start, goal: goal, wage: payment.balance * 0.97)
107    self.FlowTokenVault.borrow()!.deposit(from: <- payment)
108  }
109
110  access(all) resource Admin {
111    // ORDER COMPLETE
112    access(all) fun payWage(driverId: UInt, wage: UFix64) {
113      pre {
114        TaxiRide.DriverFlowTokenVault[driverId] != nil: "Deposit destination is nil, so we can't send wage."
115      }
116      // Pay the wage.
117      let wage <- TaxiRide.account.storage.borrow<auth(FungibleToken.Withdraw) &{FungibleToken.Provider}>(from: /storage/flowTokenVault)!.withdraw(amount: wage) as! @FlowToken.Vault
118      TaxiRide.DriverFlowTokenVault[driverId]!.borrow()!.deposit(from: <- wage)
119    }
120  }
121
122  init() {
123    self.info = Info()
124    self.FlowTokenVault = self.account.capabilities.get<&{FungibleToken.Receiver}>(/public/flowTokenReceiver)
125    self.DriverFlowTokenVault = {}
126    self.totalDrivers = 0
127    self.account.storage.save( <- create Admin(), to: /storage/TaxiRideAdmin)
128  }
129}
130