@btc-vision/btc-runtime 1.0.16 → 1.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -306,7 +306,9 @@ export abstract class OP_20 extends OP_NET implements IOP_20 {
|
|
|
306
306
|
if (allowed < value) throw new Revert(`Insufficient allowance ${allowed} < ${value}`);
|
|
307
307
|
|
|
308
308
|
const newAllowance: u256 = SafeMath.sub(allowed, value);
|
|
309
|
-
fromAllowanceMap.set(
|
|
309
|
+
fromAllowanceMap.set(spender, newAllowance);
|
|
310
|
+
|
|
311
|
+
this.allowanceMap.set(from, fromAllowanceMap);
|
|
310
312
|
|
|
311
313
|
this._unsafeTransferFrom(from, to, value);
|
|
312
314
|
|
|
@@ -8,7 +8,6 @@ import { encodePointerHash } from '../math/abi';
|
|
|
8
8
|
import { BytesWriter } from '../buffer/BytesWriter';
|
|
9
9
|
import { MAX_EVENTS, NetEvent } from '../events/NetEvent';
|
|
10
10
|
import { Potential } from '../lang/Definitions';
|
|
11
|
-
import { Map } from '../generic/Map';
|
|
12
11
|
import { OP_NET } from '../contracts/OP_NET';
|
|
13
12
|
import { PointerStorage } from '../types';
|
|
14
13
|
import {
|
|
@@ -21,6 +20,7 @@ import {
|
|
|
21
20
|
storePointer,
|
|
22
21
|
} from './global';
|
|
23
22
|
import { DeployContractResponse } from '../interfaces/DeployContractResponse';
|
|
23
|
+
import { MapU256 } from '../generic/MapU256';
|
|
24
24
|
|
|
25
25
|
export * from '../env/global';
|
|
26
26
|
|
|
@@ -28,7 +28,7 @@ export * from '../env/global';
|
|
|
28
28
|
export class BlockchainEnvironment {
|
|
29
29
|
private static readonly runtimeException: string = 'RuntimeException';
|
|
30
30
|
|
|
31
|
-
private storage: PointerStorage = new
|
|
31
|
+
private storage: PointerStorage = new MapU256();
|
|
32
32
|
private events: NetEvent[] = [];
|
|
33
33
|
|
|
34
34
|
private _callee: PotentialAddress = null;
|
|
@@ -226,14 +226,8 @@ export class BlockchainEnvironment {
|
|
|
226
226
|
const pointerHash: MemorySlotPointer = encodePointerHash(pointer, subPointer);
|
|
227
227
|
this.ensureStorageAtPointer(pointerHash, defaultValue);
|
|
228
228
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
for (let i: i32 = 0; i < allKeys.length; i++) {
|
|
232
|
-
const v: u256 = allKeys[i];
|
|
233
|
-
|
|
234
|
-
if (u256.eq(v, pointerHash)) {
|
|
235
|
-
return this.storage.get(v);
|
|
236
|
-
}
|
|
229
|
+
if (this.storage.has(pointerHash)) {
|
|
230
|
+
return this.storage.get(pointerHash);
|
|
237
231
|
}
|
|
238
232
|
|
|
239
233
|
return defaultValue;
|
|
@@ -272,17 +266,6 @@ export class BlockchainEnvironment {
|
|
|
272
266
|
}
|
|
273
267
|
|
|
274
268
|
private _internalSetStorageAt(pointerHash: u256, value: MemorySlotData<u256>): void {
|
|
275
|
-
const keys: u256[] = this.storage.keys();
|
|
276
|
-
|
|
277
|
-
// Delete the old value, there is a bug with u256 and maps.
|
|
278
|
-
for (let i = 0; i < keys.length; i++) {
|
|
279
|
-
const key = keys[i];
|
|
280
|
-
|
|
281
|
-
if (u256.eq(key, pointerHash)) {
|
|
282
|
-
this.storage.delete(key);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
269
|
this.storage.set(pointerHash, value);
|
|
287
270
|
|
|
288
271
|
const writer: BytesWriter = new BytesWriter();
|
|
@@ -294,14 +277,8 @@ export class BlockchainEnvironment {
|
|
|
294
277
|
}
|
|
295
278
|
|
|
296
279
|
private hasPointerStorageHash(pointer: MemorySlotPointer): bool {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
for (let i = 0; i < keys.length; i++) {
|
|
300
|
-
const key = keys[i];
|
|
301
|
-
|
|
302
|
-
if (u256.eq(key, pointer)) {
|
|
303
|
-
return true;
|
|
304
|
-
}
|
|
280
|
+
if (this.storage.has(pointer)) {
|
|
281
|
+
return true;
|
|
305
282
|
}
|
|
306
283
|
|
|
307
284
|
// we attempt to load the requested pointer.
|
package/runtime/generic/Map.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Revert } from '../types/Revert';
|
|
2
2
|
|
|
3
3
|
export class Map<K, V> {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
protected _keys: K[] = [];
|
|
5
|
+
protected _values: V[] = [];
|
|
6
6
|
|
|
7
7
|
public get size(): i32 {
|
|
8
8
|
return this._keys.length;
|
|
@@ -17,7 +17,7 @@ export class Map<K, V> {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
public set(key: K, value: V): void {
|
|
20
|
-
const index: i32 = this.
|
|
20
|
+
const index: i32 = this.indexOf(key);
|
|
21
21
|
if (index == -1) {
|
|
22
22
|
this._keys.push(key);
|
|
23
23
|
this._values.push(value);
|
|
@@ -26,8 +26,12 @@ export class Map<K, V> {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
public indexOf(key: K): i32 {
|
|
30
|
+
return this._keys.indexOf(key);
|
|
31
|
+
}
|
|
32
|
+
|
|
29
33
|
public get(key: K): V {
|
|
30
|
-
const index: i32 = this.
|
|
34
|
+
const index: i32 = this.indexOf(key);
|
|
31
35
|
if (index == -1) {
|
|
32
36
|
throw new Revert('Key not found in map');
|
|
33
37
|
}
|
|
@@ -35,11 +39,17 @@ export class Map<K, V> {
|
|
|
35
39
|
}
|
|
36
40
|
|
|
37
41
|
public has(key: K): bool {
|
|
38
|
-
|
|
42
|
+
for (let i: i32 = 0; i < this._keys.length; i++) {
|
|
43
|
+
if (this._keys[i] == key) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return false;
|
|
39
49
|
}
|
|
40
50
|
|
|
41
51
|
public delete(key: K): bool {
|
|
42
|
-
const index: i32 = this.
|
|
52
|
+
const index: i32 = this.indexOf(key);
|
|
43
53
|
if (index == -1) {
|
|
44
54
|
return false;
|
|
45
55
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Revert } from '../types/Revert';
|
|
2
|
+
import { u256 } from 'as-bignum/assembly';
|
|
3
|
+
import { Map } from './Map';
|
|
4
|
+
|
|
5
|
+
export class MapU256 extends Map<u256, u256> {
|
|
6
|
+
public set(key: u256, value: u256): void {
|
|
7
|
+
const index: i32 = this._keys.indexOf(key);
|
|
8
|
+
if (index == -1) {
|
|
9
|
+
this._keys.push(key);
|
|
10
|
+
this._values.push(value);
|
|
11
|
+
} else {
|
|
12
|
+
this._values[index] = value;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public indexOf(pointerHash: u256): i32 {
|
|
17
|
+
// Delete the old value
|
|
18
|
+
for (let i: i32 = 0; i < this._keys.length; i++) {
|
|
19
|
+
const key = this._keys[i];
|
|
20
|
+
|
|
21
|
+
if (u256.eq(key, pointerHash)) {
|
|
22
|
+
return i;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return -1;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public has(key: u256): bool {
|
|
30
|
+
for (let i: i32 = 0; i < this._keys.length; i++) {
|
|
31
|
+
if (u256.eq(this._keys[i], key)) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public get(key: u256): u256 {
|
|
40
|
+
const index: i32 = this.indexOf(key);
|
|
41
|
+
if (index == -1) {
|
|
42
|
+
throw new Revert('Key not found in map');
|
|
43
|
+
}
|
|
44
|
+
return this._values[index];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public delete(key: u256): bool {
|
|
48
|
+
const index: i32 = this.indexOf(key);
|
|
49
|
+
if (index == -1) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
this._keys.splice(index, 1);
|
|
54
|
+
this._values.splice(index, 1);
|
|
55
|
+
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
}
|