@ocap/statedb-memory
Version:
OCAP statedb adapter that uses memory as backend statedb, just for test purpose
40 lines (38 loc) • 1.64 kB
JavaScript
import base_default from "./base.mjs";
import { followMigrationChain, wouldCreateMigrationCycle } from "@ocap/statedb";
import { ensureChecksumAddress } from "@ocap/state/lib/states/account";
//#region src/table/account.ts
/**
* Account 表
* 扩展基础表,增加账户迁移追踪功能
*/
var AccountStateDB = class extends base_default {
async _get(address, context = {}) {
const { traceMigration = true } = context;
const normalizedAddress = ensureChecksumAddress(address);
if (!traceMigration) return super._get(normalizedAddress, context);
return followMigrationChain(normalizedAddress, (addr) => super._get(addr, context), ensureChecksumAddress);
}
async _create(key, attrs = {}, context) {
const address = ensureChecksumAddress(key);
const { migratedTo } = attrs;
if (migratedTo?.length) {
if (await wouldCreateMigrationCycle(address, migratedTo, (addr) => super._get(addr, context), ensureChecksumAddress)) throw new Error(`Circular migration detected: ${address} -> ${migratedTo.join(", ")}`);
}
return super._create(address, {
...attrs,
[this.uniqIndex]: address
}, context);
}
async _update(key, updates, context) {
const address = ensureChecksumAddress(key);
const { migratedTo } = updates;
if (migratedTo?.length) {
if (await wouldCreateMigrationCycle(address, migratedTo, (addr) => super._get(addr, context), ensureChecksumAddress)) throw new Error(`Circular migration detected: ${address} -> ${migratedTo.join(", ")}`);
}
return super._update(address, updates, context);
}
};
var account_default = AccountStateDB;
//#endregion
export { account_default as default };